Кросс-компиляция C для Windows в Linux, ошибка компиляции - PullRequest
1 голос
/ 07 марта 2012

Все,

Я использую цепочку инструментов 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 , существуют различия между путями поиска для 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? Как отметил Игнасио ниже, getopt - это POSIX.И какой самый простой способ обойти эту проблему?

  • Сбросить до ISO C?
  • Добавить / usr / include для поиска пути для компилятора?
  • Скопировать error в / usr / i586-mingw32msvc / include /?

1 Ответ

0 голосов
/ 07 марта 2012

Заголовок error.h, как вы указали в своем последнем комментарии на момент написания этой статьи, является частью GNU libc, он же glibc, он же библиотека C системы GNU.

Вы компилируете для Windows , он не имеет GNU libc, он использует msvcr *.Вы не можете волшебным образом кросс-компилировать код Linux / GNU, как этот, и ожидать, что он будет работать.

...