«

»

Sep 01

Портирование С++ приложений с Linux под Windows

По результатам увлекательнейших часов, проведенных за портированием весьма пользительной и любопытной библиотеки для визуальной одометрииFOVIS – с линукса под виндовз решил вынести в качестве заметок на полях некоторые полезные ссылки и приемы для сходных целей. Будет обновляться.

Несмотря на то, что указывается Linux, описанное ниже справедливо для всех POSIX-систем – MacOs, Solaris, BSD,…

Выравнивание структур:

Windows:

__declspec( align( align_value ) )

Linux:

__attribute__ ((aligned (align_value)))

какая-нибудь простенькая макра будет полезна:

#ifdef WIN32
#define ALIGN_DATA(align_value) __declspec(align(align_value))
#else
#define ALIGN_DATA(align_value) __attribute__ ((aligned (align_value)))
#endif

Выравание структур под Windows/Linux, дополнительная информация:
Описание MSDN выравнивания для Windows: http://msdn.microsoft.com/ru-ru/library/83ythb65.aspx
Обсуждение тонкостей кросс-платформенного выравнивания структур (обратить внимание на директиву pragma pack): http://www.rsdn.ru/forum/cpp/3368697.flat.aspx
Обсуждение атрибута __attribute__ ((__packed__)) в Windows: http://stackoverflow.com/questions/1537964/visual-c-equivalent-of-gccs-attribute-packed
Описание принципов по которым можно узнать текущее выравнивание структур/классов с учетом виртуальных методов/наследования – http://www.rsdn.ru/forum/cpp/1461439.aspx

Динамическое выделение памяти с учетом выравнивания:

Windows:

Выделение памяти:

void * _aligned_malloc(
    size_t size,
    size_t alignment
);

Освобождение памяти:

void _aligned_free (
   void *memblock
);

Linux:

Выделение памяти:

int posix_memalign(
    void **memptr,
    size_t alignment,
    size_t size
);

Освобождение памяти:

void free(void *ptr); // yeah, yeah - ordinal free in posix systems do all job

Выделение памяти в куче с выравниванием, дополнительные ссылки:
MSDN описание функции _aligned_malloc – http://msdn.microsoft.com/en-us/library/8z34s9c6(v=vs.80).aspx
Список функций для работы с выравненными данными – http://msdn.microsoft.com/en-us/library/fs9stz4e(v=vs.80).aspx
описание функции posix_memalign – http://pubs.opengroup.org/onlinepubs/009696699/functions/posix_memalign.html
в общем, про выравнивание структур – http://en.wikipedia.org/wiki/Data_structure_alignment

Математические функции:

Windows:

Представление бесконечности и не числового значения:

numeric_limits::infinity()
numeric_limits::quiet_NaN( )

Проверка на NAN:

int isnan(real-floating x);

Округление:

std::floor, std::ceil
[//code]

!Обратить внимание на правила округления.

Linux:

Представление бесконечности и не числового значения:

INFINITY
NAN

Проверка на NAN:

int isnan(real-floating x);

Округление:

double round(double x);

Макра:

#ifdef WIN32
#define INFINITY numeric_limits::infinity()
#define NAN numeric_limits::quiet_NaN( )
#define isnan _isnan
#endif

Ссылки по теме математических функций в Windows/Linux:
isnan от Posix - http://pubs.opengroup.org/onlinepubs/9699919799/functions/isnan.html
_isnan MSDN - http://msdn.microsoft.com/en-us/library/aa298428(v=vs.60).aspx
POSIX-овый math.h с описанием - http://pubs.opengroup.org/onlinepubs/009695299/basedefs/math.h.html

Экспорт функций:

Под Винду студия создает *.lib файлы, только в случае, если если есть функции, объявленные с соответствующий модификатором - __declspec(dllexport). Хотя вместо них можно использовать def-файлы (Module-Definition (.Def) Files). Под Linux же подобные ухищрения ни к чему - все символы/функции будут доступны из статической библиотеки. Напрашивается очередная макра для экспорта функций для Linux/Windows:

 #ifdef WIN32
 #define FOVIS_EXPORT __declspec(dllexport)
 #else
 #define FOVIS_EXPORT
 #endif

Портирование Linux-проектов на Windows, разное:

Не хватка заголовочных файлов "stdint.h" и "inttypes.h" при сборке Linux-проектов на Windows:
Необходимо поблагодарив разработчиков вот этого проекта - http://code.google.com/p/msinttypes/ - скачать готовый архив с нужными заголовками и подключить их к проекту.

Linux-Windows словарь функций:
указано название linux-функции, ее Windows аналог (если существует) и необходимые заголовочные файлы:
http://suacommunity.com/dictionary/index.php

Интересная статья на тему использования в экспортированных классах стандартных контейнеров, ворнингов c4251 - needs to have dll-interface to be used by clients of class - http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html

UPDATE 11.02.2013
получив немало новых впечатлений в процессе единоборств с библиотекой iSam, спешу добавить еще несколько легко забываемых ньюансов:

Аналоги ключей компиляции Windows/Linux:

Указать уровень оптимизации: -O2 для Linux, /O2 для Windows.
Указать выходной файл: -o для Linux, /Fo для Windows.
Указать модель исключений (при сочетании C++ и C кода): -fexceptions для Linux, /EHac для Windows.

А вообще:
список опций компилятора Visual Studio
http://msdn.microsoft.com/en-us/library/9s7c9wdw%28v=vs.71%29.aspx
список опций компилятора GNU gcc
http://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.html#Invoking-GCC

Комплексные числа

#ifdef WIN32
#include <complex>
typedef std::complex<double> name_of_your_complex_type;
#define CS_REAL(x) real(x)
#define CS_IMAG(x) imag(x)
#define CS_CONJ(x) conj(x)
#define CS_ABS(x) abs(x)
std::complex<double> I(0,1); // value 0 + 0i
#else
#include <complex.h>
#define name_of_your_complex_type double _Complex
#define CS_REAL(x) creal(x)
#define CS_IMAG(x) cimag(x)
#define CS_CONJ(x) conj(x)
#define CS_ABS(x) cabs(x)
#endif

некоторые детали по использованию комплексных чисел:
http://stdcxx.apache.org/doc/stdlibug/20-2.html

2 comments

  1. nnnn

    Зачем в адресе страницы “с” русская использована?

    1. admin

      боюсь, что это роковая случайность 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>