По результатам увлекательнейших часов, проведенных за портированием весьма пользительной и любопытной библиотеки для визуальной одометрии – 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
Зачем в адресе страницы “с” русская использована?
Author
боюсь, что это роковая случайность 🙂