QtCreator для iOS: как развернуть разделяемую библиотеку dylib с моим приложением
Мне трудно развернуть динамические разделяемые библиотеки на iOS.
Чтобы изолировать и раскрыть проблему, у меня есть очень простой проект "HelloWorld": класс экспорта библиотеки с функцией, возвращающей "Hello World", и программой, использующей класс и отображающей сообщение.
Я использую QtCreator с Qt 5.5.
Я могу генерировать .dylib
файл и ссылка моей программы. Но при развертывании его на iPhone я получаю сообщение об ошибке:
Démarrage des processus distants.
dyld: Library not loaded: libMyLib.1.dylib
Referenced from: /private/var/mobile/Containers/Bundle/Application/D6942CCE-828D-4C10-86DA-F7DA7ADF7449/MyApp.app/MyApp
Reason: image not found
На Android у меня была такая же проблема, и я мог ее исправить, добавив общую библиотеку в файл конечного пакета (apk) вручную, используя ANDROID_EXTRA_LIBS
, Но я не могу найти аналога для iOS.
Вот мои.pro файлы. Полный проект можно скачать здесь. Я сообщил об этом Qt как об ошибке, но если кто-то может предложить какой-то обходной путь, это поможет!
MyLib.pro:
QT -= core gui
TARGET = MyLib
TEMPLATE = lib
DEFINES += MYLIB_LIBRARY
SOURCES += mylib.cpp
CONFIG += shared
HEADERS += mylib.h\
mylib_global.h
MyApp.pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MyApp
TEMPLATE = app
SOURCES += main.cpp\
dialog.cpp
HEADERS += dialog.h
INCLUDEPATH += ../MyLib
LIBS += ../MyLib/libMyLib.dylib
Я бы хотел, чтобы решение было встроено в QtCreator. Единственное, что нужно изменить, - это один из двух файлов.pro. Возможно с вызовами после сборки к командам MACOS...? Или просто инструкция после сборки в MyApp.pro, чтобы скопировать dylib в нужное место (целевая папка.app) перед развертыванием приложения? Я действительно удивлен, что QtCreator не скрывает это молча....
Примечание: этот вопрос предлагает задать DYLD_LIBRARY_PATH
, Но у меня нет подсказок, чтобы сделать это в файле MyApp.pro, и как это поможет при развертывании iOS (так как DYLD_LIBRARY_PATH может установить MAC PATH для lib, а не iPhone PATH для lib...)
2 ответа
1) Убедитесь, что в вашем библиотечном проекте у ваших дилибов есть имя для установки @rpath/mylib.dylib
или такой. Например, добавив QMAKE_SONAME_PREFIX = @rpath
в вашу библиотеку.pro файл.
(Вы можете проверить, посмотрев на первую строку otool -L /path/to/libmylib.dylib
, Если библиотека является предварительно созданной третьей стороной, измените ее на install_name_tool -id @rpath/libmylib.dylib
)
2) добавить следующее.pro-файл приложения
# link to the lib:
LIBS += -L../mylib -lmylib
# make the app find the libs:
QMAKE_RPATHDIR = @executable_path/Frameworks
# deploy the libs:
mylib.files = $$OUT_PWD/mylib/libmylib.1.dylib
mylib.path = Frameworks
QMAKE_BUNDLE_DATA += mylib
Я придумал обходной путь для этого, на случай, если он кому-нибудь поможет.
Создайте свою библиотеку статически, а не динамически (замените
CONFIG += shared
отCONFIG += staticlib
Теперь компилятор сгенерирует
*.a
файлы вместо*.dylib
, Вы должны использовать это расширение при компоновке библиотек (заменитеLIBS += myLib.dylib
отLIBS += myLib.a
)Если ваша библиотека была связана только с программой, вы сделали
Если ваша библиотека, назовем ее (A), использовалась другой библиотекой (B), то (B) больше не должна с ней связываться (Нет
LIB
флаг в B.pro). Только программа верхнего уровня будет связываться со всеми вашими статическими библиотеками.
При таком подходе я мог бы развернуть программу с использованием 15 библиотек на iPhone с помощью QtCreator.