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ライブラリに見つからないことがわかります(構成の問題...?)。これは、問題を解決するために何をすべきかについて私にあまり教えてくれませんでしたが、おそらくそれは他の誰かに手がかりを与えるかもしれません。