我想链接一个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的库我建(构问题没有找到。 ..?)。这并没有开导我多为应该做些什么来解决这个问题,但也许可能会给别人一个线索。