2015-09-02 194 views
2

在构建C++项目时,我们有多个目标: 32位和64位。交叉编译:检查是否可以在64位机器上构建32位

在某些64台的机器,同时建立32位的目标,我们已经看到了失败,因为G ++ - multilib的丢失:

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

我的问题是这样的:

什么是最好的方式根据安装的编译器和glibc软件包查询当前机器是否能够生成32位图像。

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

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

取而代之,我想查询机器以查看是否安装了所有nesscary软件包。

P.S:

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

感谢,

伊泰

+0

也许[这个](http://serverfault.com/questions/54736/how-to-check-if-a-library-is-installed)会有帮助吗? – Glapa

回答

0

它可能会帮助,

尝试到你的机器这是GNU C语言库上安装的libc6-DEV-I386:为AMD64 32位开发库。

0

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

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

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

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

eg如果您的实际代码需要包含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的部分。

+2

事实上,在waf中进行这种检查相当容易:https://waf.io/book/#_configuration_helpers – haraldkl

+0

@haraldkl thx,在答案中指出。 –

相关问题