交叉编译:检查是不是可以在 64 位机器上构建 32 位

Posted

技术标签:

【中文标题】交叉编译:检查是不是可以在 64 位机器上构建 32 位【英文标题】:cross compile: check if it is possible to build 32 bit on a 64 bit machine交叉编译:检查是否可以在 64 位机器上构建 32 位 【发布时间】:2015-09-02 07:05:06 【问题描述】:

在构建 C++ 项目时,我们有几个目标: 32 位和 64 位。

在一些 64 位机器上,我们在构建 32 位目标时遇到了失败,因为缺少 g++-multilib:

/usr/include/features.h:374:25: fatal error: sys/cdefs.h: No such file or directory 

我的问题是:

就安装的编译器和 glibc 包而言,查询当前机器是否能够生成 32 位图像的最佳方法是什么。

一种解决方案可能是,例如, 生成一个包含多个 glibc 包含的简单 C 文件,看看我是否能够编译模拟文件。

这似乎不是优雅的解决方案。

相反,我想查询机器以查看是否安装了所有 nesscary 包。

PS:

我们使用 WAF 作为构建基础架构。

谢谢,

伊泰

【问题讨论】:

也许this 会有所帮助? 【参考方案1】:

检查给定包的存在通常不是一个好主意,因为它依赖于特定的发行版(例如 Fedora)和特定的包名称(例如 libc6-dev-i386);其他发行版(或相同发行版的其他版本)将具有不同的包名称和工具来与包管理器交互(例如apt vs rpm vs ...)

完善的自动工具方法是针对您实际需要的东西运行测试(例如包含给定的头文件),而不是检查可能提供您需要的东西(例如某些包)-

例如如果您的实际代码需要包含features.h,那么您应该测试(在预构建步骤中)是否可以包含此文件而不会出现错误。

如果无法使用features.h,以下自动工具示例将停止并出现错误;这允许用户在开始耗时的构建过程之前通过安装正确的包(例如,如您的自述文件中所暗示的那样)来解决问题。

 #snippet from configure.ac
 #stop configure process if we cannot use foo.h
 AC_CHECK_HEADERS([foo.h],,AC_ERROR([cannot include foo.h - try installing libfoo-dev])

如果您宁愿简单地禁用部分构建,而不是失败配置步骤,您可能想要执行以下操作:

配置.ac:

 have_bar_h="no"
 AC_CHECK_HEADERS([bar.h],[have_bar_h="yes"])
 AM_CONDITIONAL([BAR]) [ test "x$have_bar_h" = "yes" ]

和 Makefile.am

 if BAR
 # only do the 32bit build if we have bar.h
 bin_PROGRAMS+=coolapp32
 ebduf

很抱歉,这个答案是特定于 autotools 的,但我确信 waf 有类似的方法;查看WAF 文档中关于Configuration helpers 的部分。

【讨论】:

确实,在 waf 中进行此类检查相当容易:waf.io/book/#_configuration_helpers【参考方案2】:

可能会有帮助,

尝试在您的机器上安装 libc6-dev-i386,它是嵌入式 GNU C 库:AMD64 的 32 位开发库。

【讨论】:

【参考方案3】:

您想查询机器以查看是否安装了所有必需的 32 位软件包...

rpm -qa --queryformat 'libc6-dev-%ARCH\n' | grep 'i[6543]86' | cut -d' ' -f1

【讨论】:

以上是关于交叉编译:检查是不是可以在 64 位机器上构建 32 位的主要内容,如果未能解决你的问题,请参考以下文章

如何交叉编译solaris 32位

如何使用交叉编译的构建调试 Qt dll 问题?

Google 协议缓冲区交叉编译

在 32 位 Xp 计算机上构建 64 位 Qt

32 位 dll 参考在 64 位机器上没有失败

在 64 位机器上编译 tcpsplice