【问题标题】:Crosscompiling C for windows on linux, getting a compiler error在 linux 上为 windows 交叉编译 C,得到编译器错误
【发布时间】:2012-03-07 15:03:22
【问题描述】:

全部,

我正在使用 mingw32 工具链在 linux 平台上进行交叉编译。一切都很好,直到我从标准库中包含了<error.h>。现在mingw32吐出编译器错误,说找不到error.h

虽然这是一个 GNU 扩展,但我也在使用 GNU getopts.h,它确实有效。那么,为什么我会遇到这个问题?以下是详细输出:

[09:57:48]$ i586-mingw32msvc-gcc scanner.c -O -Wall  -o brookfieldSplitter.exe -v 2>&1 | sed ':1;s,/[^/.][^/]*/\\.\\./,/,;t 1'
Using built-in specs.
Target: i586-mingw32msvc
Configured with: /build/buildd/mingw32-4.2.1.dfsg/build_dir/src/gcc-4.2.1-2-dfsg/configure -v --prefix=/usr --target=i586-mingw32msvc --enable-languages=c,c++ --enable-threads --enable-sjlj-exceptions --disable-multilib --enable-version-specific-runtime-libs
Thread model: win32
gcc version 4.2.1-sjlj (mingw32-2)
 /usr/libexec/gcc/i586-mingw32msvc/4.2.1-sjlj/cc1 -quiet -v scanner.c -quiet -dumpbase scanner.c -mtune=pentium -auxbase scanner -O -Wall -version -o /tmp/cc4itePc.s
ignoring nonexistent directory "/usr/i586-mingw32msvc/sys-include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/i586-mingw32msvc/4.2.1-sjlj/include
 /usr/i586-mingw32msvc/include
End of search list.
GNU C version 4.2.1-sjlj (mingw32-2) (i586-mingw32msvc)
        compiled by GNU C version 4.4.4.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 593b76e6db3b48c579d5ccd7737af5b4
scanner.l:53:19: error: error.h: No such file or directory
scanner.l: In function 'main':
scanner.l:638: warning: implicit declaration of function 'error'

正如mingw32 wiki page 中所述,gcc 和 mingw32 的搜索路径之间存在差异。您可以在上面的输出中看到它搜索 #include 项目的位置。

locate error.h 的内容按要求:

[10:44:42]$ locate error.h
/usr/i586-mingw32msvc/include/raserror.h
/usr/i586-mingw32msvc/include/winerror.h
/usr/include/error.h
/usr/include/glib-2.0/gio/gdbuserror.h
/usr/include/glib-2.0/gio/gioerror.h
/usr/include/glib-2.0/glib/gerror.h
/usr/include/i386-linux-gnu/bits/error.h
/usr/include/linux/can/error.h
/usr/lib/syslinux/com32/include/gplinclude/disk/error.h
/usr/share/doc/ipython/manual/html/api/generated/IPython.kernel.core.error.html
/usr/share/doc/ipython/manual/html/api/generated/IPython.kernel.error.html
/usr/share/pgadmin3/docs/cs_CZ/connect-error.html
/usr/share/pgadmin3/docs/en_US/connect-error.html
/usr/share/pgadmin3/docs/fr_FR/connect-error.html
/usr/share/webkitgtk-1.0/webkit-1.0/resources/error.html
/usr/share/webkitgtk-3.0/webkit-3.0/resources/error.html
/usr/src/linux-headers-3.0.0-12/arch/ia64/sn/include/ioerror.h
/usr/src/linux-headers-3.0.0-12/arch/mips/include/asm/fw/cfe/cfe_error.h
/usr/src/linux-headers-3.0.0-12/include/linux/can/error.h
/usr/src/linux-headers-3.0.0-12-generic/include/config/ata/verbose/error.h

为什么 mingw32 包含 GNU 扩展 getopt 而不是 error 正如下面 Ignacio 所指出的,getopt 是 POSIX。解决此问题的最简单方法是什么?

  • 降到 ISO C?
  • 将 /usr/include 添加到编译器的搜索路径?
  • 复制error到/usr/i586-mingw32msvc/include/?

【问题讨论】:

  • 这根本不像是 linker 错误。试试locate error.h 文件是否存在于您将 GCC 指向的位置?
  • "Can't find error.h" 是编译器错误,而不是链接器错误。哦,标准 C 库中没有 error.h。你的意思是errno.h
  • 你的交叉编译器的包含目录中有error.h吗?
  • 啊……我在我的 Linux 机器上的 /usr/include 中看到了一个。不确定 Windows 是否也会包含它。
  • @larsmans 不,这就是问题所在。正如我所说,它是一个 GNU 扩展,就像getopt。令我惊讶的是getopt 是如何包含在内的,但error 却没有。这提出了一个问题是它不受支持,还是我只需要使用我在/usr/include 中的副本?

标签: c linux mingw cross-compiling


【解决方案1】:

标题 error.h,正如您在撰写本文时的最后一条评论中所链接的那样,是 GNU libc(又名 glibc,又名 GNU 系统的 C 库)的一部分。

您正在为 Windows 编译,它没有 GNU libc,它使用 msvcr*。你不能像这样神奇地交叉编译 Linux/GNU 代码并期望它能够工作。

【讨论】:

  • 这也是我得出的结论。当我第一次开始这个时,我认为既然getopt 有效,那么error 也会有效。正如 Ignacio 在他的评论中指出的那样,getopt 是 POSIX。这就是 it 起作用的原因。此时我已迁移回 ISO 标准错误消息处理。
  • getopt 是 POSIX 并不是它适用于 MinGW 的原因。大多数 POSIX 不可能以与 msvcrt 兼容的方式实现(例如 locale_t 扩展),因此这样做意味着必须重写所有 C 运行时并且与 Windows 系统 C 运行时不兼容。 MinGW 实现了 POSIX 的这一小部分(以及其他一些),但在编写 Windows 代码时不依赖 POSIX 或 GNU 文档。使用 msdn.com。它相当广泛。
  • 我希望在交叉编译的文档中更清楚地说明这一点。感谢您的提醒。
  • @SpencerRathbun 这与交叉编译 sich 无关。这同样适用于在另一个平台上本地编译。您正在为该平台构建代码,因此您必须使用该平台的库。如果您要交叉编译到 Linux,文档会大不相同(您显然会查看 developer.apple.com)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多