在构建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作为构建基础架构。
谢谢,
伊泰
答案 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