1

Linuxホスト上のMacOSターゲット用にクロスコンパイルしたQtプログラムをリンクしようとしています。ここ(https://github.com/Tatsh/xchain)にある手順に従って、gccを正常にビルドしました。そのページにあるように、両方の単純なテストプログラムをコンパイルおよびリンクして、MacOSで正常に実行される実行可能ファイルを生成できます。

この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ライブラリがあります。簡潔にするためにそれらを省略しました。

私が得るエラーは、コマンドラインにオブジェクトまたはライブラリを追加しないという典型的なものです。次に例を示します。

...
  "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ライブラリが見つからないようです。

また、-L / pathと-lQtFooコンボの代わりにlibファイルを直接指定しようとしました。また、それらの名前を.dylibから.soに変更しようとしました:)

-vを指定してg++を実行し、リンカー呼び出しを確認してから、それに-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の内容も問題ないようですが、私はこの部分にあまり精通していません...実際、私はちょうど今ここで別の質問で「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

また、「名前修飾」についてはあまり詳しくありませんが、これと関係があるのではないかと感じています。

これまでのところ、このクロスコンパイル全体のことはかなり長い道のりだったので、これが終わりに近づいて、これほど私を困惑させる何かにぶつかるのは残念です-アドバイスをいただければ幸いです!

****編集** *

ld64呼び出しの-dynamicフラグを削除すると、異なる関数名が欠落していると表示されることがわかりました。たとえば、上記の「QMainWindow :: event(QEvent *)」への参照が欠落していると、次のようになります。

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

そして今、私はこれらの名前が実際に私が構築したQtライブラリに見つからないことがわかります(構成の問題...?)。これは、問題を解決するために何をすべきかについて私にあまり教えてくれませんでしたが、おそらくそれは他の誰かに手がかりを与えるかもしれません。

4

2 に答える 2

0

完全な答えはありませんが、nm出力の「U」は、シンボルがその実行可能ファイル(この場合はライブラリ)で定義されていないが、外部で定義されていることを意味します。リンクされたライブラリ。そのライブラリに実際に何か問題がある可能性があることを示唆しています。

補足として、nmの-C引数を使用して、C++シンボルをデマングルすることができます。

于 2012-08-06T22:56:01.730 に答える
0

詳細は完全には理解していませんが、なんとかこの問題を乗り越えることができました。もともと私はmkspecsファイルにこれらの2行を持っていましたが、Qtのビルド時にエラーは発生しませんでしたが、コメントアウトすると問題が修正されました。

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

私はこれらを必要だと思ってこのようなクロスコンパイラ実行可能ファイルに設定しましたが、ツールチェーン内のすべては正しいgccとg++を指定するだけで処理されるようです。

于 2012-08-07T22:06:04.383 に答える