在64位Linux机器上的gcc中创建'long'4个字节

时间:2012-10-09 07:08:05

标签: linux gcc 64-bit long-integer

我正在努力将应用程序移植到Linux平台上的64位。该应用程序目前在Linux,Windows,Mac 32位和Windows 64位上受支持。我们经常遇到的问题之一是对int使用long,反之亦然。直到现在这都不是问题,因为long和int在当前支持应用程序的平台中是可互换的(都是4个字节)。代码库是一个巨大的代码库,许多遗留代码都带有#defines用于许多数据类型,这使得搜索所有long的使用并使用int适当替换它很麻烦。

  1. 作为一个短期解决方案,有没有办法让GCC使用4个字节而不是8个用于“长”?
  2. 如果有,我们可能遇到的问题是什么?如果没有,是否有更简单的方法来修复long和int问题?

3 个答案:

答案 0 :(得分:9)

-m32生成32位代码。

-mx32生成64位代码,但使用32位长和指针。

Intel 386 and AMD x86-64 Options

答案 1 :(得分:5)

  1. 没有。在Linux x86_64上,ABI指定long是8字节类型(LP64)。事实上,大多数(如果不是全部)64位Unix系统(包括64位OS X,AFAIK)都是LP64,因此这不是Linux所特有的。

  2. 除了修复代码之外,没有。

  3. 如果你需要一个足以存储指针值的可移动整数类型,请使用intptr_t或uintptr_t(但通常希望将指针值存储到整数中意味着你做错了,所以请三思!) 。对于能够表示两个指针之间差异的整数类型,请使用ptrdiff_t。对于对象的大小,请使用size_t。

答案 2 :(得分:2)

这取决于你的意思是"移植到64位"。

  1. 您只是希望您的应用程序能够在64位Linux上运行:您可以将其编译为32位,并且它将在大多数提供32位库的发行版上以兼容模式运行。为此,您必须使用32位版本的gcc(例如Ubuntu上的包gcc:i386),或使用带有本机gcc版本的-m32标志。

  2. 您希望从处理器的long mode(又名x86_64架构)中受益,但仍然使用大多数32位C约定(包括4个字节的long int):您可以使用x32 ABI使用gcc的-mx32标志,这要求您的发行版允许它(必须在内核中启用支持,并且需要特定的库,例如在/libx32中)。我正在使用Ubuntu 16.04,这种模式工作得非常好,只是可用的预编译库要少得多。

  3. 您希望完全使用x86_64架构和ABI,但需要4个字节long:这是不可能的,因为x86_64 ABI要求long为8个字节。