我想鏈接一個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的庫我建(構問題沒有找到。 ..?)。這並沒有開導我多爲應該做些什麼來解決這個問題,但也許可能會給別人一個線索。