binutils构建失败,因为pex-unix文件的问题。

10
我想要交叉编译GCC。我使用MSYS2作为命令行界面,并且使用mingw-w64作为编译器。
我已经下载了binutils-2.25,并使用以下命令进行配置:
../binutils/./configure --target=sh3eb-elf --prefix=C:/tempinstall/ --disable-nls

我在尝试在“libiberty/pex-unix”文件上构建“binutils”时遇到了错误:

在函数“pex_wait”中: 错误:未声明“F_GETFD”(在此函数中首次使用) 错误:未声明“FD_CLOEXEC”(在此函数中首次使用) 错误:未声明“F_SETFD”(在此函数中首次使用) 错误:未声明“F_DUPFD”(在此函数中首次使用)

在函数“restore_fd”中: 错误:未声明“FD_CLOEXEC”(在此函数中首次使用) 错误:未声明“F_SETFD”(在此函数中首次使用)

在函数“pex_unix_fdopenw”中: 错误:未声明“F_SETFD”(在此函数中首次使用) 错误:未声明“FD_CLOEXEC”(在此函数中首次使用)

几个月前,我已经没有问题地构建了相同的编译器。但是我之后更改了操作系统(从Windows 7到W10)和编译器(MinGW-GCC 4.8更改为Mingw64-GCC 4.9)
我按照此教程进行操作。

我在libiberty/config.log文件中发现了一行奇怪的代码 pexecute = "pex-unix"。也许configure没有检测到Windows 10。你觉得这可能吗? - Intelligide
2个回答

9
我找到了解决方案:
我使用带有msys2_shell的MSys2,该shell将--msys定义为主机系统。
但是当我使用mingw32_shell(该shell将--mingw32定义为主机)时,GNU-Make编译pex-win32,并且它可以正常工作。

1
问题在于,在MSYS2下运行GNU configure脚本时,默认情况下,buildhost系统被报告为i686-pc-msysx86_64-pc-msys
然而,binutils(和gcc)的配置脚本不认识第三部分中的msys,因此构建默认为Unix构建。这反过来导致编译pex-unix,它需要sys/wait.h中的POSIX特性,而MinGW-w64没有提供。
配置脚本对目标mingw*cygwin*有特殊情况,这避免了这个问题,并导致编译pex-win32.c
我认为预期的解决方案是,当我们想要使用MinGW-w64构建时,应该使用快捷方式“MSYS2 MinGW 32位”或“MSYS2 MinGW 64位”启动MSYS2。这些快捷方式设置环境变量,以便将主机字符串设置为i686-w64-mingw32i686-w64-mingw64(如果您使用64位MSYS2,则在两种情况下都使用x86_64而不是i686)。然后,binutils配置脚本会选择其mingw情况并构建正确的内容。

但是,即使编译binutils-2.28尝试构建pex-win32.c,我仍然遇到了一堆编译错误:_open未声明等等。

我没有进一步调查,因为我先尝试了其他方法,结果成功了:我启动了标准的MSYS2 shell(而不是MinGW-w64变体),将/mingw32/bin放在PATH的最前面,并向configure传递了--build=i686-w64-mingw32参数,用于binutils和gcc。
这样做成功了,我能够构建完整的交叉工具链(实际上是针对arm-eabi v0),没有MSYS2依赖。

1
我不确定为什么你的回答没有得到任何赞,因为这对我很有效。唯一的区别是我必须使用 pacman -R gcc 从 MSYS2 卸载 gcc,从 GitHub releases 安装 MingW32 并将其解压到根驱动器,打开 MingW64 终端,设置 PATH=${PATH}:/c/mingw32/bin,运行 configure 然后运行 make - Joe
我这样假设是因为MSYS2 GCC编译器遵循POSIX标准的特性。 - Joe
1
@joe 感谢您的评论。我猜这是一个低流量问题 - 没有太多人在做这个! - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接