【问题标题】:Problem with libraries and Mingw-gcc to cross-compile Win32 code on Linux库和 Mingw-gcc 在 Linux 上交叉编译 Win32 代码的问题
【发布时间】:2011-10-31 16:36:50
【问题描述】:

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

通常在使用 gcc 编译程序时,会使用 -l 链接器参数来指定要链接的库。使用 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)下编译得很好。

【问题讨论】:

    标签: linux winapi gcc mingw cross-compiling


    【解决方案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 记录自动引入的。

    【讨论】:

    • 谢谢,罗德里戈。我想我应该提到上面的程序在 Linux 上本地编译得很好(我知道库的订购要求——我应该举一个真实的例子)。查看修改后的问题——我添加了一些清晰度。
    猜你喜欢
    • 2021-12-21
    • 2011-04-18
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多