Как определить 64-битную сборку в Linux с помощью препроцессора? - PullRequest
3 голосов
/ 26 марта 2009

Я собираюсь перенести 32-битное приложение Windows на 64-битную версию, но, возможно, позже решу перенести все это на Linux.

Код содержит разделы, которые зависят от объема памяти, доступной для приложения (который зависит от того, создаю ли я 32- или 64-битную сборку), в то время как возможность компилировать 32-битную версию кода должна быть сохранено для обратной совместимости.

В Windows я могу просто обернуть соответствующие разделы кода в операторы препроцессора, чтобы обеспечить компиляцию нужной версии кода.

К сожалению, у меня очень мало опыта программирования на платформе Linux, поэтому возник вопрос:

Как мне определить 64-битную сборку на платформе Linux?

Существует ли какой-либо (предпочтительно не зависящий от компилятора) препроцессор, который я мог бы проверить для этого?

Заранее спасибо!

\ Бьорн

Ответы [ 2 ]

6 голосов
/ 27 марта 2009

Предполагается, что вы используете недавний компилятор GNU GCC для IA32 (32-разрядная версия) и amd64 (не-Itanium 64-разрядная цель для AMD64 / x86-64 / EM64T / Intel 64), поскольку очень немногие люди нуждаются в другом компилятор для Linux (Intel и PGI).

Имеется переключатель строки компилятора (который вы можете добавить к CFLAGS в Makefile) -m64 / -m32 для управления целью сборки.

Для условного кода C:

#if defined(__LP64__) || defined(_LP64)
#define BUILD_64   1
#endif

или

#include <limits.h>
#if ( __WORDSIZE == 64 )
#define BUILD_64   1
#endif

В то время как первый является специфическим для GCC, второй является более переносимым, но может быть неправильным в какой-то странной среде, о которой я не могу думать.

В настоящее время оба должны корректно работать для сред IA-32 / x86 (x86-32) и x86-64 / amd64. Я думаю, они могут работать и на IA-64 (Itanium).

Также см. Статью Андреаса Йегера из саммита разработчиков GCC под названием Портирование на 64-битные системы GNU / Linux , в которой более подробно описаны 64-битные среды Linux.

5 голосов
/ 26 марта 2009

Согласно Руководству GCC :

__LP64__

_LP64

Эти макросы определены со значением 1, если (и только если) сборник для цели, где долго int и pointer используют как 64-битные, так и int использует 32-битный.

Это то, что тебе нужно, верно?

Также вы можете попробовать

#define __64BIT (__SIZEOF_POINTER__ == 8)
...