![](/img/trans.png)
[英]How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake
[英]Making 'long' 4 bytes in gcc on a 64-bit Linux machine
我正在努力将应用程序移植到Linux平台上的64位。 该应用程序目前在Linux,Windows,Mac 32位和Windows 64位上受支持。 我们经常遇到的问题之一是对int使用long,反之亦然。 直到现在这都不是问题,因为long和int在当前支持应用程序的平台中是可互换的(都是4个字节)。 代码库是一个巨大的代码库,许多遗留代码都带有#defines用于许多数据类型,这使得搜索所有long的使用并使用int适当替换很麻烦。
在Linux x86_64上,ABI指定long是8字节类型(LP64)。 事实上,大多数(如果不是全部)64位Unix系统(包括64位OS X,AFAIK)都是LP64,所以这并不是Linux特有的。
除了修复你的代码,没有。
如果你需要一个足以存储指针值的可移动整数类型,请使用intptr_t或uintptr_t(但通常希望将指针值存储到整数中意味着你做错了,所以请三思!)。 对于能够表示两个指针之间差异的整数类型,请使用ptrdiff_t。 对于对象的大小,请使用size_t。
这取决于你的意思是“移植到64位”。
您只是希望您的应用程序在64位Linux上运行:您可以在32位编译它,它将在大多数提供32位库的发行版上以兼容模式运行。 为此,您必须使用32位版本的gcc(例如,在Ubuntu上包gcc:i386
),或者使用带有本机gcc版本的-m32
标志。
您希望从处理器的长模式 (也称为x86_64体系结构)中受益,但仍然使用大多数32位C约定(包括4个字节的long int
):您可以使用gcc的-mx32
标志来使用x32 ABI ,要求您的发行版允许它(必须在您的内核中启用支持,并且需要特定的库,例如/libx32
)。 我正在使用Ubuntu 16.04,这种模式工作得很好,除了可用的预编译库少得多。
您希望使用x86_64架构和ABI,但long
为4个字节:这是不可能的,因为x86_64 ABI要求long
为8个字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.