【问题标题】:How to identify a 64 Bit build on Linux using the preprocessor?如何使用预处理器识别 Linux 上的 64 位构建?
【发布时间】:2010-10-15 16:02:20
【问题描述】:

我即将将 Windows 32 位应用程序移植到 64 位,但以后可能会决定将整个应用程序移植到 Linux。

代码包含的部分取决于应用程序可用的内存量(这取决于我创建的是 32 位还是 64 位版本),而编译 32 位版本代码的能力应该是为向后兼容而保留。

在 Windows 上,我可以简单地将相应的代码部分包装到预处理器语句中,以确保编译正确版本的代码。

很遗憾我在Linux平台上编程的经验很少,所以问题出现了:

如何识别 Linux 平台上的 64 位版本?

是否有任何(最好是非编译器特定的)预处理器定义我可以检查?

提前致谢!

\比约恩

【问题讨论】:

    标签: c linux build 64-bit


    【解决方案1】:

    假设您正在为 IA32(32 位)和 amd64(AMD64 / x86-64 / EM64T / Intel 64 的非安腾 64 位目标)使用最新的 GNU GCC 编译器,因为很少有人需要不同的Linux 编译器(Intel 和 PGI)。

    有编译器行开关(您可以在 Makefile 中添加到 CFLAGS)-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)。

    另请参阅 Andreas Jaeger 在 GCC 开发者峰会上发表的题为 Porting to 64-bit GNU/Linux Systems 的论文,其中更详细地描述了 64 位 Linux 环境。

    【讨论】:

    • 有一个 100% 可移植的替代方案:#if UINTPTR_MAX == 0xffffffff(32 位)#else(假设为 64 位或测试其他可能性)。
    • 更具体地说,uintptr_t 对于 C99 是可选的。但是,Linux 似乎要求这种类型的存在,以及:sizeof(void *) == sizeof(long)
    【解决方案2】:

    根据GCC Manual

    __LP64__

    _LP64

    当(且仅当) 编译是针对一个很长的目标 int 和 pointer 都使用 64 位和 int 使用 32 位。

    这就是你需要的,对吧?

    你也可以试试

    #define __64BIT (__SIZEOF_POINTER__ == 8)
    

    【讨论】:

    • 与Solaris CC相同,如果不是则定义_ILP32。我花时间查了一下,DrJokepu 打败了我 :-(
    • 你会看那个 - 一个提到实际文档的答案! :) +1。
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2011-12-23
    • 2019-02-13
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多