Я пытаюсь связать программу Qt, которую я кросс-компилировал для цели MacOS на хосте Linux. Я следовал инструкциям, найденным здесь (https://github.com/Tatsh/xchain), чтобы успешно собрать gcc, и я могу скомпилировать и связать обе простые тестовые программы, как на этой странице, для создания исполняемых файлов, которые отлично работают на MacOS.
Я собрал свой собственный Qt из исходного кода, используя этот gcc, и я могу без проблем скомпилировать свою программу 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 находится.
Я также попытался указать файлы lib напрямую вместо комбинации -L/path и -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/
Расположение и установка библиотеки выглядят нормально:
$ 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
Содержимое библиотеки также кажется в порядке, но я не слишком знаком с этой частью ... на самом деле я только что обнаружил «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
Я также не слишком знаком с «искажением имен», но у меня такое чувство, что это может иметь какое-то отношение к этому.
До сих пор я проделал довольно долгий путь со всей этой кросс-компиляцией, поэтому отстойно быть так близко к концу и столкнуться с чем-то, что действительно меня так сильно ставит в тупик - любой совет будет очень признателен!
** ИЗМЕНИТЬ ***
Я обнаружил, что если я убираю флаг -dynamic для вызова ld64, разные имена функций отображаются как отсутствующие. Например, отсутствующая ссылка на "QMainWindow::event(QEvent*)", упомянутая выше, становится:
"__ZN11QMainWindow5eventEP6QEvent", referenced from:
__ZTV10MainWindow in moc_MainWindow.o
И теперь я вижу, что эти имена действительно НЕ найдены в библиотеках Qt, которые я создал (проблема с конфигурацией...?). Это не очень помогло мне понять, что нужно сделать, чтобы решить проблему, но, возможно, это может дать кому-то ключ к разгадке.