2012-08-06 117 views
1

我想鏈接一個Qt程序,我已經爲Linux主機上的MacOS目標交叉編譯。我按照這裏找到的說明(https://github.com/Tatsh/xchain)成功構建gcc,並且可以編譯和鏈接這兩個簡單的測試程序,以生成在MacOS上運行良好的可執行文件。Qt交叉編譯Linux - > MacOS無法鏈接到Qt庫

我已經使用這個gcc從源碼構建了我自己的Qt,並且我可以順利編譯我的Qt程序。問題出現在鏈接階段,當我的程序的目標文件應該鏈接到Qt庫時,它幾乎看起來好像根本找不到Qt庫,或者因爲它們在某種程度上不兼容而被忽略。

我的計劃的目標文件和Qt庫我建這兩個似乎是確定:

$ file MainWindow.o 
MainWindow.o: Mach-O object i386 

$ file /usr/local/myqt/mac32/Qt-4.8.2/lib/libQtCore.dylib.4.8.2 
/usr/local/myqt/mac32/Qt-4.8.2/lib/libQtCore.dylib.4.8.2: Mach-O dynamically linked shared library i386 

的G ++調用是這樣的:

$ i686-apple-darwin10-g++ -o myapp.app/Contents/MacOS/myapp 
    main.o MainWindow.o ... 
    -L/usr/local/myqt/mac32/Qt-4.8.2/lib -lQtCore -lQtGui ... 

當然還有更多的對象文件和更多的Qt庫,爲簡潔起見,我已將它們排除在外。

我得到的錯誤是典型的根本就不是添加對象或LIB命令行,例如:

... 
    "QMainWindow::event(QEvent*)", referenced from: 
     vtable for MainWindowin moc_MainWindow.o 
    "QDir::~QDir()", referenced from: 
     _main in main.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

,似乎基本上所有的Qt的lib沒有被發現。

我也曾嘗試指定LIB文件,而不是直接的-L /路徑和-lQtFoo組合,我甚至試圖從名爲.dylib重新命名他們是.so :)

如果我運行的g ++與-v看到連接通話,然後還可以添加-v來,我可以看到被檢查庫的路徑看行:

$ i686-apple-darwin10-ld64 -dynamic -arch i386 -headerpad_max_install_names 
    -macosx_version_min 10.4 -syslibroot /usr/i686-apple-darwin10 
    -weak_reference_mismatches non-weak -o myapp.app/Contents/MacOS/myapp 
    -lcrt1.o /usr/i686-apple-darwin10/SDKs/MacOSX10.6.sdk/usr/bin/../lib/gcc/i686-apple-darwin10/4.2.1/crt3.o 
    main.o MainWindow.o 
    ... 
    -L/usr/local/myqt/mac32/Qt-4.8.2/lib -lQtCore -lQtGui ... 
    -v 
@(#)PROGRAM:ld64 PROJECT:odcctools-622.3od16 
Library search paths: 
    /usr/local/myqt/mac32/Qt-4.8.2/lib 
    /usr/i686-apple-darwin10/usr/X11/lib 
    /usr/local/myqt/mac32/Qt-4.8.2/lib 
    /usr/i686-apple-darwin10/usr/lib/i686-apple-darwin10/4.2.1 
    /usr/i686-apple-darwin10/usr/lib 
    /usr/i686-apple-darwin10/SDKs/MacOSX10.6.sdk/usr/lib/gcc/i686-apple-darwin10/4.2.1 
    /usr/i686-apple-darwin10/SDKs/MacOSX10.6.sdk/usr/lib/gcc 
    /usr/i686-apple-darwin10/usr/lib/gcc/i686-apple-darwin10/4.2.1 
    /usr/i686-apple-darwin10/SDKs/MacOSX10.6.sdk/usr/i686-apple-darwin10/lib 
    /usr/i686-apple-darwin10/SDKs/MacOSX10.6.sdk/usr/i686-apple-darwin10/lib 
    /usr/i686-apple-darwin10/usr/lib 
    /usr/local/lib 
Framework search paths: 
    /usr/i686-apple-darwin10/Library/Frameworks/ 
    /usr/i686-apple-darwin10/System/Library/Frameworks/ 

的LIB位置和設置看起來不錯:

$ ls -lh /usr/local/myqt/mac32/Qt-4.8.2/lib/libQtCore.dylib* 
lrwxrwxrwx. 1 root root 21 Aug 7 05:22 /usr/local/myqt/mac32/Qt-4.8.2/lib/libQtCore.dylib -> libQtCore.dylib.4.8.2 
lrwxrwxrwx. 1 root root 21 Aug 7 05:22 /usr/local/myqt/mac32/Qt-4.8.2/lib/libQtCore.dylib.4 -> libQtCore.dylib.4.8.2 
lrwxrwxrwx. 1 root root 21 Aug 7 05:22 /usr/local/myqt/mac32/Qt-4.8.2/lib/libQtCore.dylib.4.8 -> libQtCore.dylib.4.8.2 
-rwxr-xr-x. 1 root root 2.7M Aug 7 05:22 /usr/local/myqt/mac32/Qt-4.8.2/lib/libQtCore.dylib.4.8.2 

的lib conten ts也似乎沒問題,但我對這部分不太熟悉......實際上我剛剛在這裏發現了另一個問題'nm'。

$ i686-apple-darwin10-nm /usr/local/myqt/mac32/Qt-4.8.2/lib/libQtGui.dylib.4.8.2 | grep event 
    U __ZN16QCoreApplication5eventEP6QEvent 
    U __ZN16QEventTransition5eventEP6QEvent 
    U __ZN16QEventTransition9eventTestEP6QEvent 
    U __ZN17QVariantAnimation5eventEP6QEvent 
    U __ZN19QAbstractTransition5eventEP6QEvent 
    U __ZN23QCoreApplicationPrivate15eventDispatcherE 
    U __ZN7QObject11eventFilterEPS_P6QEvent 
    U __ZN7QObject5eventEP6QEvent 

我也不太熟悉'name mangling',但我感覺它可能與此有關。

到目前爲止,這個整個交叉編譯的事情已經過去了很長的一段旅程,所以它接近尾聲並且碰到了一個真正讓我感到困惑的東西 - 任何建議都將不勝感激!

** 編輯 ** *

我發現,如果我拿出-dynamic標誌的ld64電話,不同的功能名稱顯示爲丟失。例如缺少參考「的QMainWindow ::事件(QEvent的*)」中提到變爲:

"__ZN11QMainWindow5eventEP6QEvent", referenced from: 
     __ZTV10MainWindow in moc_MainWindow.o 

現在我可以看到,這些名字的確,在Qt的庫我建(構問題沒有找到。 ..?)。這並沒有開導我多爲應該做些什麼來解決這個問題,但也許可能會給別人一個線索。

回答

0

我設法讓過去這個問題,儘管沒有完全瞭解它的細節。我原本在mkspecs文件這兩行雖然他們構建Qt時,註釋出來解決了這一問題並沒有引起任何錯誤:

QMAKE_RANLIB = i686-apple-darwin10-ranlib 
QMAKE_STRIP  = i686-apple-darwin10-strip 

我這些設置交叉編譯器可執行文件是這樣想它是必要的,但似乎只是通過指定正確的gcc和g ++來處理工具鏈中的所有內容。

0

我沒有給你一個完整的答案,但我可以告訴你,「U」在納米輸出裝置的符號是不是在可執行文件中定義(或庫在這種情況下),但預計會定義在一個外部鏈接的庫中,這表明該庫可能實際上存在某些錯誤。

作爲一個側面說明,您可以用-c參數納米把它還原函數的C++符號。