簡體   English   中英

庫和Mingw-gcc在Linux上交叉編譯Win32代碼的問題

[英]Problem with libraries and Mingw-gcc to cross-compile Win32 code on Linux

我試圖交叉編譯我在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)。

這里的問題是命令行參數的順序。 如果庫與-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記錄自動引入的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM