繁体   English   中英

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

[英]cross compile: check if it is possible to build 32 bit on a 64 bit machine

在构建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 include的简单C文件,然后查看我是否能够编译该模拟文件。

这似乎不是一个很好的解决方案。

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

PS:

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

谢谢,

伊泰

检查给定软件包的存在通常不是一个好主意,因为它依赖于特定的发行版(例如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])

如果不想让配置步骤失败,而只是简单地禁用构建的某些部分,则可能需要执行以下操作:

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文档中有关配置帮助器的部分。

这可能会有所帮助,

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM