2011-08-21 147 views
1

我正在嘗試交叉編譯我在Linux for Windows上編寫的一些C/C++程序。我有很多使用GCC和MSVC的經驗。庫問題和Mingw-gcc在Linux上交叉編譯Win32代碼

正常情況下,使用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)。

回答

1

這裏的問題是按照命令行參數的順序。如果庫鏈接到-l,鏈接器將僅使用所需的目標模塊來滿足迄今爲止所看到的任何未解決的引用。從info ld,選項-l

如果存檔限定 符號將其在一些物體 在命令行上的歸檔出現之前未定義,鏈接器將包括從存檔的 適當文件(S) 。但是,稍後在命令行中出現的對象中未定義的 符號將不會導致鏈接程序再次搜索歸檔文件。

但是,當您編寫庫的完整路徑時,它將完全鏈接。

所以編譯程序簡單地寫:

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記錄帶入。

+0

謝謝,rodrigo。我想我應該提到,上面的程序在Linux上本地編譯得很好(我知道庫的訂購要求 - 我應該舉一個真實的例子)。看看修改後的問題 - 我補充了一點清晰。 – tetrisfrog