Кросс-компиляция Qt Linux -> MacOS не может ссылаться на библиотеки Qt

Я пытаюсь связать программу 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, которые я создал (проблема с конфигурацией...?). Это не очень помогло мне понять, что нужно сделать, чтобы решить проблему, но, возможно, это может дать кому-то ключ к разгадке.


person iforce2d    schedule 06.08.2012    source источник


Ответы (2)


У меня нет для вас полного ответа, но я могу сказать вам, что «U» в вашем выводе nm означает, что символ не определен в этом исполняемом файле (или в библиотеке в данном случае), но ожидается, что он будет определен во внешнем связанную библиотеку, предполагая, что с этой библиотекой действительно что-то не так.

В качестве побочного примечания, вы можете использовать аргумент -C для nm, чтобы он демонтировал ваши символы C++.

person NeoSkye    schedule 06.08.2012

Мне удалось обойти эту проблему, хотя и без полного понимания ее деталей. Изначально у меня были эти две строки в файле mkspecs, и хотя они не вызывали ошибок при сборке Qt, их закомментирование устранило проблему:

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

Я установил их для исполняемых файлов кросс-компилятора, думая, что это необходимо, но кажется, что обо всем в цепочке инструментов заботится просто указание правильных gcc и g++.

person iforce2d    schedule 07.08.2012