在Linux上交叉编译C for windows,收到编译器错误

时间:2012-03-07 15:03:22

标签: c linux mingw cross-compiling

所有

我正在使用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 /?

1 个答案:

答案 0 :(得分:0)

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

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