在 linux 上为 windows 交叉编译 C,出现编译器错误

标签 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/?

最佳答案

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

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

关于在 linux 上为 windows 交叉编译 C,出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9603869/

相关文章:

c - Switch 忽略预定义的 case 并跳转到 default case

windows - MinGW 与 MSVC 下的 Windows 导出/导入符号; CMake WINDOWS_EXPORT_ALL_SYMBOLS 被忽略

c - 有效取消引用 C 中的整数作为指针文字

在终止并正确返回正确输出的程序上找不到 valgrind 错误

c++ - 我怎样才能让我的 linux 服务触发我的信号?

php - XAMPP - 如何从主目录执行 PHP 文件?

c - mingw64 pjsip sizeof(fd_set) 总是双倍 sizeof(pj_fd_set_t) 导致 sock_select.c 中的断言

c - 有没有办法让类变量像虚拟变量一样具有setter/getter?

c - C语言中如何知道何时按下回车键

linux - 如何将命令的输出通过管道传输到 Linux 上的文件