MinGW: неопределенная ссылка на `iupKeyCodeToName(int)'
Я пытаюсь сделать исполняемый файл для Windows этого примера: https://www.tecgraf.puc-rio.br/iup/examples/C/sample.c В Linux с помощью этого инструмента: https://github.com/jprjr/iup-build На Ubuntu 16.04, но я получаю эту ошибку компоновки при попытке кросс-компиляции:
daniel@daniel-desktop:~/Desktop/$ make
i686-w64-mingw32-g++ -static -I/home/daniel/iup-build/deps/iup-3.22/include -I/home/daniel/iup-build/deps/cd-5.11.1/include -I/home/daniel/iup-build/deps/im-3.12/include -I/home/daniel/iup-build/deps/zlib-1.2.8/include -I/home/daniel/iup-build/deps/freetype-2.6.3/include -o sample.exe sample.c -L/home/daniel/iup-build/deps/iup-3.22/lib/mingw4 -L/home/daniel/iup-build/deps/cd-5.11.1/lib/mingw4 -L/home/daniel/iup-build/deps/im-3.12/lib/mingw4 -L/home/daniel/iup-build/deps/zlib-1.2.8/lib/mingw4 -L/home/daniel/iup-build/deps/freetype-2.6.3/lib/mingw4 -lm -lcdim -lim -lim_process -lcd -liupcd -liupim -liupimglib -liupcontrols -liup -liupgl -lz -lim -lcd -lfreetype6 -lgdi32 -lcomdlg32 -lcomctl32 -luuid -loleaut32 -lole32 -lwinspool
/tmp/cccFDodU.o:sample.c:(.text+0x1da): undefined reference to 'iupKeyCodeToName(int)'
/tmp/cccFDodU.o:sample.c:(.text+0x215): undefined reference to 'iupKeyCodeToName(int)'
/tmp/cccFDodU.o:sample.c:(.text+0x55e): undefined reference to 'iupKeyCodeToName(int)'
collect2: error: ld returned 1 exit status
makefile:18: recipe for target 'sample.exe' failed
make: *** [sample.exe] Error 1
libiup.a, кажется, имеет iupKeyCodeToName:
daniel@daniel-desktop:~/iup-build/output/iup-3.22-i686-w64-mingw32/i686-w64-mingw32/lib$ nm -C -A *.a | grep iupKeyCodeToName
libiup.a:iup_key.o:00000340 T iupKeyCodeToName
libiup.dll.a:d000887.o:00000000 I _imp__iupKeyCodeToName
libiup.dll.a:d000887.o:00000000 T iupKeyCodeToName
Так что я понятия не имею, что является причиной этого, я также попытался сделать то же самое, но изначально на Windows 7, также используя mingw, но потерпел неудачу с той же самой ошибкой.
Однако я могу скомпилировать этот пример для Linux на Ubuntu 16.04, используя gcc без каких-либо проблем.
1 ответ
Вероятно, потому, что объявление функции выполняется в файле. Я полагаю, поскольку вы используете g ++ для построения примера, он может быть скомпилирован как C++, тогда объявление функции неверно, потому что отсутствует внешний C. Это ошибка компоновщика.
Я думаю, что-то вроде этого может решить проблему:
#ifdef __cplusplus
extern "C" char *iupKeyCodeToName(int code);
#endif