如何在64位机器上将C++程序编译为64位?

21

也许是一个非常琐碎的问题:

我需要将程序编译为64位(先前的makefile编译为32位)。

我在每个文件编译时的命令行参数中看到了-m32选项。因此,我修改了makefile以摆脱 OPTFLAG 中的 -m32 ,但是当程序编译时,我仍然看到 -m32 出现,而且二进制文件仍然是32位的。这个m32是否还从其他地方来?


你想要编译什么?如果它使用的是autotools而不是调整Makefile,也许你可以使用正确的标志重新配置它。如果这不是你自己的软件,最好向相应的社区询问如何正确构建他们的软件。从gcc的角度来看,你需要它的正确版本和-m64 http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options。 - mlt
make命令不会预定义-m32,也没有任何其他系统组件(除非有相关的发行版特定修改,但通常没有),如果这是你的问题。 - user743382
当我尝试强制使用 -m64 时,会出现 "CPU you selected does not support x86-64 instruction set" 的错误。任何线索吗?uname -a 命令显示的是 x86_64。 - xyz
4
“您所选的CPU”消息意味着在Makefile中有一个像“-march=i686”这样的选项,它不适用于64位编译。尝试将其删除或在命令行后面添加“-march=generic”。请注意,这些更改不应修改原始含义。 - Jonathan Wakely
1
抱歉,-mtune=generic 是有效的,但 -march=generic 不是。建议已移至新答案。 - Jonathan Wakely
显示剩余4条评论
3个回答

24

-m32 只能从您的 makefiles 中某处得到,您需要跟踪它(使用递归 grep 命令)并将其删除。

当我强制使用 -m64 时,我得到了“CPU you selected does not support x86-64 instruction set”的错误。有什么线索吗?uname -a 命令的输出结果是 x86_64。

这个错误意味着在 makefiles 中有像 -march=i686 这样的选项,在 64 位编译中无效,请尝试将其删除。

如果您无法删除它(请再努力!),那么在命令行中添加 -march=x86-64 将指定一个通用的 64 位 CPU 类型。


9

如果您正在构建的软件是基于autotools的,那么这应该可以解决问题:

./configure "CFLAGS=-m64" "CXXFLAGS=-m64" "LDFLAGS=-m64" && make

或者,对于一个普通的Makefile:

env CFLAGS=-m64 CXXFLAGS=-m64 LDFLAGS=-m64 make

正如我之前在评论中提到的,-m64 是为 64 位配置的 gcc 的默认设置。如果您需要指定 -m64,那么您可能做错了什么。如果该软件包认为它需要添加 -m32,那么它可能会执行更多操作,而您无法处理其余部分。 - user743382

1
如果您使用的是CMake,您可以通过以下方式添加m64编译选项:
add_compile_options(-m64)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接