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 += staticlibreplaceCONFIG += shared

  • 现在,编译器将生成*.a文件而不是*.dylib ,链接库时必须使用此扩展名(用LIBS += myLib.dylibreplaceLIBS += myLib.a

  • 如果你的图书馆只通过一个程序链接,你就完成了

  • 如果你的库被称为(A),被另一个库(B)使用,那么(B)不应该再链接它(B.pro中没有LIB标志)。 只有最高级别的程序会与你所有的静态库链接。

通过这种方法,我可以在QtCreator的iPhone上部署一个使用15个库的程序。