вторник, 22 марта 2011 г.

портирование под linux 64bit

а вот например давеча на старости лет угораздило меня портировать некую самопальную либу, изначально написанную под windows, на 64битную бубунту. Должен заметить что это отвратительно (например у них в gcc нету _byteswap_ulong & _lrotl)

После некоторого количества произнесенного мата и страшных заклинаний про мать оно таки собралось, да. Только тесты не проходят. Под windows 32bit & 64bit все работает, так же как и под linux 32bit, что совсем уже подозрительно. А под linux 64 бит - нет
В результате долгих ковыряний в отладчике выяснилось что все дело в размере long. Дело в том что у них все не как у людей принята т.н. LP64 модель - размер long & pointer равны 64 битам, а размер int - 32. Люто-бешенно ненавижу

Ну и как скажите мне правильно писать одновременно под windows & linux и 32 & 64 бит в таком случае ? Или может книжка какая есть умная специально про такие случаи ?

Update: книжка нашлась -Cross-Platform Development in C++: Building Mac OS X, Linux, and Windows Applications. Учитывая что она довольно свежая (декабрь 2007), я надеюсь про 64битные операционки там чо-нть да будет рассказано

7 комментариев:

  1. Тоже в своё время сильно матерился, когда выяснил что мой код криво работает под linux 64 из-за нестандартного размера long-a.
    Подозреваю, что в сурьёзных проектах нужно делать как-то так:
    #ifdef _MSVC_
    typedef unsigned long ULONG;
    #elif _GCC_
    typedef unsigned int ULONG;
    #endif

    ОтветитьУдалить
  2. а почему _MSVC_, а не _MSC_VER например ?
    кроме того меня тут просветили, что под linux есть файл заголовков stdint.h, в котором уже описаны типы int32_t & uint32_t, и лучше всего использовать именно их. Томущо они грозятся быть одинаковыми под linux 32 & 64.
    Однако услышав следующий логичный вопрос - а под freebsd есть такой же header ? - местный гуру впал в продолжительную задумчивость, бгг

    ОтветитьУдалить
  3. Используй LP32, тебе реально надо 64-бита?

    stdint.h и intypes.h - это С99, оба есть под freebsd.

    А переопределения ни к чему хорошему не приведут (только если свои типы введешь и на них перейдешь).

    ОтветитьУдалить
  4. > Используй LP32
    типичные отмазки линуксоидов. Когда их носом тычут в кривую убогую реализацию чего-либо или вовсе в отсутствие таковой - они громко вопят в ночи "значит это никому не нужно", "не осилил !", "используй xyz" (где xyz точно такая же убогая, для сборки требует over 9000 пакетов, не проходит 99% тестов и годится для решения задачи еще менее). При этом они даже формулировку задачи умудряются не спросить или переврать, бгг

    сколько звезд у тебя на погонах на лоре ? (c)

    ОтветитьУдалить
  5. Мне пофиг какая там реализация. Хочешь быть уверенным в размере типов - введи свои. Жил бы под nix'ами думал бы иначе.

    Кстати, JFYI я под винды писать больше люблю.

    ОтветитьУдалить
  6. > Хочешь быть уверенным в размере типов - введи свои
    еще раз для особо невнимательных - код уже был отлажен и портирован на 64 бита под винду. Почему я не могу его без гемора собрать под 64битный же линукс на том же самом камне ?

    > Жил бы под nix'ами
    упаси меня сотона !

    > я под винды писать больше люблю
    потому что там все для людей сделано, а не для совместимости со всяким хламом 30-40 летней давности

    ОтветитьУдалить