9

我想交叉编译GCC。我使用 MSYS2 作为 shell,使用 mingw-w64 作为编译器。

我已经下载了 binutils-2.25 并配置了:

../binutils/./configure --target=sh3eb-elf --prefix=C:/tempinstall/ --disable-nls

当我尝试binutilslibiberty/pex-unix文件上构建时出现错误:

在函数“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)

我跟着这个教程

4

2 回答 2

9

我找到了解决方案:

我将 MSys2 与定义- -msys 的 msys2_shell 一起使用为主机系统。

但是当我使用 mingw32_shell(将- -mingw32 定义为主机)时,GNU-Make 编译 pex-win32 并且它工作正常

于 2015-08-28T12:15:30.240 回答
0

问题是,默认情况下,configure在 MSYS2 下运行 GNU 脚本时,buildandhost系统报告为i686-pc-msys, 或x86_64-pc-msys.

binutils但是,第三部分中(and )的配置脚本gcc无法识别msys,因此构建默认为 Unix 构建。反过来,这会导致pex-unix被编译,这需要 POSIX 功能sys/wait.h,而 MinGW-w64 不提供这些功能。

配置脚本确实有针对目标mingw*和的特殊情况cygwin*,这会导致编译pex-win32.c,从而避免了该问题。


我认为预期的解决方案是,当我们想使用 MinGW-w64 构建时,我们应该使用快捷方式“MSYS2 MinGW 32-bit”或“MSYS2 MinGW 64-bit”启动 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,并将参数传递--build=i686-w64-mingw32configurefor binutils 和 gcc .

这成功了,我能够构建一个完整的交叉工具链(实际上是 arm-eabi v0),它没有 MSYS2 依赖项。

于 2017-04-07T10:36:28.163 回答