QtCreator for iOS:如何用我的应用程序部署一个dylib共享库
我很难在iOS上部署dynamic共享库。
为了隔离和暴露问题,我有一个非常简单的“HelloWorld”项目:一个带有返回“Hello World”函数的库导出类和一个使用该类并显示消息的程序。
我正在Qt 5.5中使用QtCreator。
我能够生成.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上,我遇到了同样的问题,可以通过使用ANDROID_EXTRA_LIBS
手动添加共享库到最终包(apk)文件来修复它。 但是我找不到iOS的等价物。
这是我的.pro文件。 完整的项目可以在这里下载。 我把这个报告给Qt作为一个bug ,但是如果能提出一种解决方法,这将有助于!
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
我希望解决scheme全部embedded到QtCreator中。 唯一认为应该改变的是两个.pro文件之一。 可能与后构build调用MACOS命令…? 或者只是在应用程序部署之前,在MyApp.pro中的后期构build指令将dylib复制到正确的位置(.app目标文件夹)? 我真的很惊讶,这不是由QtCreator静静地覆盖….
注意: 这个问题build议设置DYLD_LIBRARY_PATH
。 但我不知道如何在MyApp.pro文件中执行此操作,也不会在iOS部署中如何提供帮助(因为DYLD_LIBRARY_PATH可以设置到lib的MAC PATH,而不是通过lib的iPhone PATH)
1)在你的库项目中,确保你的dylib有installname @rpath/mylib.dylib
等等。 例如通过将QMAKE_SONAME_PREFIX = @rpath
添加到您的库.pro文件中。
(你可以通过查看otool -L /path/to/libmylib.dylib
的第一行来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
我想出了一个解决方法,以防万一它可以帮助任何人。
-
静态构build你的库而不是dynamic的(用
CONFIG += staticlib
replaceCONFIG += shared
-
现在,编译器将生成
*.a
文件而不是*.dylib
,链接库时必须使用此扩展名(用LIBS += myLib.dylib
replaceLIBS += myLib.a
) -
如果你的图书馆只通过一个程序链接,你就完成了
-
如果你的库被称为(A),被另一个库(B)使用,那么(B)不应该再链接它(B.pro中没有
LIB
标志)。 只有最高级别的程序会与你所有的静态库链接。
通过这种方法,我可以在QtCreator的iPhone上部署一个使用15个库的程序。