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

时间:2015-09-02 07:05:07

标签: c++ linux cross-compiling waf

在构建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软件包。

P.S:

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

谢谢,

伊泰

3 个答案:

答案 0 :(得分:5)

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

成熟的autotools方法是针对您实际需要的东西运行测试(例如,包含给定的头文件),而不是检查可能提供您需要的东西(例如,某个包裹) -

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

如果无法使用features.h,则以下autotools示例将停止并显示错误;允许用户通过在开始耗时的构建过程之前安装正确的软件包(例如,在README中暗示)来解决问题。

 #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])

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

configure.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的部分。

答案 1 :(得分:0)

这可能会有所帮助,

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

答案 2 :(得分:0)

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

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