交叉编译:检查是不是可以在 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 位的主要内容,如果未能解决你的问题,请参考以下文章