我正在尝试交叉编译我在Linux for Windows上编写的一些C / C ++程序。我在使用GCC和MSVC方面有很多经验。
通常在使用gcc编译程序时,可以使用-l linker参数指定要链接的库。使用MingW-gcc链接器时,这似乎无法正常工作。
GCC版本:
i586-mingw32msvc-gcc (GCC) 4.4.4
当链接使用的程序(例如,GTK +或libpng,libz等)时,使用类似的东西:
i586-mingw32msvc-gcc -mwindows -L/opt/xcompile-win32/lib -lmylib -lmylib2 myprog.o -o myprog.exe
给出了关于库函数未定义引用的大量错误。但是,如果我将库指定为其他对象:
i586-mingw32msvc-gcc -mwindows -L/opt/xcompile-win32/lib /opt/xcompile-win32/lib/libmylib.a /opt/xcompile-win32/lib/libmylib2.a myprog.o -o myprog.exe
一切正常,最终的程序效果很好!我的问题是:有没有办法让正常的-l库参数正常工作?这种方法看起来有点麻烦!我似乎无法在网上找到解决此问题的任何内容。谢谢!
修改
澄清一下:命令行中库参数的顺序没有区别。此外,程序只使用-l参数在Linux(gcc)上编译得很好。实际命令如下:
i586-mingw32msvc-gcc -mwindows -o win32/vmclient.exe win32/gtk_test.o \
-L/opt/xcompile-win32/lib -latk-1.0 -lpangoft2-1.0 -lpangocairo-1.0 \
-lgdk_pixbuf-2.0 -lm -lcairo -lpng12 -lpango-1.0 -lfreetype -lfontconfig \
-lgmodule-2.0 -lgthread-2.0 -lglib-2.0
win32/gtk_test.o:gtk_test.c:(.text+0x37): undefined reference to `_gtk_init_abi_check'
(和一堆类似的错误)。当以完全相同的顺序直接引用.a库文件时,该程序可以很好地编译Win32(使用i586-mingw32msvc-gcc)。
答案 0 :(得分:1)
此处的问题是命令行参数的顺序。如果与链接器-l
链接的库将仅采用所需的对象模块来满足到目前为止所见的任何未解析的引用。来自info ld
,选项-l
:
如果存档定义了 在之前出现的某个对象中未定义的符号 在命令行上存档,链接器将包含 存档中的相应文件。但是,未定义 稍后出现在命令行中的对象中的符号不会 使链接器再次搜索存档。
但是当你写出图书馆的完整路径时,它就完全链接了。
所以要编译你的程序只需写:
i586-mingw32msvc-gcc -mwindows myprog.o -o myprog.exe \
-L/opt/xcompile-win32/lib -lmylib -lmylib2
最后有图书馆。
顺便说一句,如果我没有弄错,这种行为在本机linux编译器中没有什么不同。修改强>
回复编辑时,您忘记在编译器命令中添加一些库。您遗失了-lgtk-win32-2.0 -lgdk-win32-2.0
。
我个人觉得使用pkg-config
工具更方便。交叉编译时就像导出PKG_CONFIG_LIBDIR=/op/xcompile-win32/pkgconfig
一样简单。
在linux中它工作正常可能是因为缺少的库是由其他库中的NEEDED
记录自动引入的。