我正在开发一个项目的Autoconf脚本,该脚本应该在Linux和Mac上运行,32位和64位。在Linux上,检测64位很容易:x86_64
得到i386
而不是build_cpu
。我无法弄清楚如何为Mac执行此操作:32位和64位计算机都为i386
提供build_cpu
。有没有办法使用Autoconf builtins检测差异?
额外问题:在64位CPU上,有一种更好的方法可以以编程方式检测二进制文件是32位还是64位而不是以下内容?
file NAME_OF_BINARY | sed -e 's/.*[^0-9]\([0-9]*\)-bit.*/\1/g'
答案 0 :(得分:2)
要找出二进制文件支持哪些体系结构,你可以使用文件,你可以解析otool -f [name of bin]
的输出,你可以解析lipo -info [name of bin]
的输出,或者你可以自己读取胖文件头(这是一个相当简单且记录良好的结构)。如果您有一个单体系结构二进制文件,那么otool
可以告诉您Mach-O标头,它告诉您编译它的体系结构。
不知道autoconf在内部提供了什么作为主机架构,但是由于x86_64 Mac可以运行x86_64,i386或ppc7400二进制文件,因此区别有点没有实际意义。要么编译一个通用二进制文件,这是Apple推荐你做的,要么查看sysctl hw.optional.x86_64
来确定你在哪个框。
答案 1 :(得分:2)
i386
获得build_cpu
的原因可能是因为gcc
默认情况下在Mac OS X上以32位模式编译,即使在64位CPU上也是如此。处理此问题的最简单方法可能是将其推送给用户:如果他们想要64位二进制文件,他们可以将--build=x86_64-darwin
传递给configure
。
答案 2 :(得分:0)
要记住的一件事是,在Mac上,您可以编译多个体系结构,并生成“通用二进制文件”(以前称为“胖二进制文件”)。简单地使用-arch i386 -arch x86_64
编译可能会更好,这将允许用户在运行时选择运行哪一个(如果你想支持旧的PPC Mac,你还可以包括-arch ppc -arch ppc64
)。这样,如果用户最终将他们的文件系统从一台机器移动到另一台机器,他们仍然会为给定的机器提供适当的二进制文件。有关详细信息,请参阅64-bit Transition Guide。