linux - 库和 Mingw-gcc 在 Linux 上交叉编译 Win32 代码的问题

标签 linux winapi gcc mingw cross-compiling

我正在尝试交叉编译一些我在 Linux for Windows 上编写的 C/C++ 程序。我有很多使用 GCC 和 MSVC 的经验。

通常在使用 gcc 编译程序时,人们会使用 -l 链接器参数来指定要链接的库。使用 MingW-gcc 链接器时,这似乎无法正常工作。

海湾合作委员会版本: i58​​6-mingw32msvc-gcc (GCC) 4.4.4

链接使用(例如,GTK+ 或 libpng、libz 等)的程序时,使用类似:

i58​​6-mingw32msvc-gcc -mwindows -L/opt/xcompile-win32/lib -lmylib -lmylib2 myprog.o -o myprog.exe

给出大量关于库函数 undefined reference 的错误。但是,如果我像这样将库指定为附加对象:

i58​​6-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)。

最佳答案

这里的问题在于命令行参数的顺序。如果库与 -l 链接,则链接器将只采用满足目前所见的任何未解决引用所需的目标模块。来自 info ld,选项 -l:

If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again.

但是当您编写库的完整路径时,它会被完全链接。

所以要编译你的程序只需写:

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 记录自动引入的。

关于linux - 库和 Mingw-gcc 在 Linux 上交叉编译 Win32 代码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140118/

相关文章:

c++ - 如何将 SFML 游戏服务器部署到 Linux 服务器?

linux - 从 .net core Linux 调用 shell 命令的问题

linux - 有没有办法在特定时间自动提交 git 中的更改

linux - postgres 用户可以使用任何密码或不使用密码登录

c++ - 使用 C++ Win32 API 在 Messagebox 中禁用右上角的 X 按钮图标?

linux - gdb:检查堆栈和小端澄清

c++ - 关于 __attribute__ 和 noinline (GCC) 的问题

c - 重新提交 DMA 引擎事务

Windows native API : When and why use Zw vs Nt prefixed api calls?

c++ - 检测按键按下和按键释放事件