2012-08-06 141 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++符号。