我在 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 文件。可以下载完整的项目here https://bugreports.qt.io/secure/attachment/51438/bug_dylib.zip。我将此报告给Qt 作为一个 bug https://bugreports.qt.io/browse/QTCREATORBUG-15135,但如果有人能提出一种解决方法,这将会有所帮助!
MyLib.pro:
QT -= core gui
TARGET = MyLib
TEMPLATE = lib
DEFINES += MYLIB_LIBRARY
SOURCES += mylib.cpp
CONFIG += shared
HEADERS += mylib.h\
mylib_global.h
我的应用程序.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 没有默默地涵盖这一点......
Note: 这个问题 https://stackoverflow.com/questions/13611740/qt-mac-osx-10-8-dyld-library-not-loaded-image-not-found建议设置DYLD_LIBRARY_PATH
。但我不知道如何在 MyApp.pro 文件中执行此操作,也不知道它对 iOS 部署有什么帮助(因为 LD_LIBRARY_PATH 可以设置 lib 的 MAC 路径,而不是 lib 的 iPhone 路径...)