QtCreator for iOS:如何使用我的应用程序部署 dylib 共享库

Posted

技术标签:

【中文标题】QtCreator for iOS:如何使用我的应用程序部署 dylib 共享库【英文标题】:QtCreator for iOS: How to deploy a dylib shared library with my application 【发布时间】:2015-10-01 14:37:39 【问题描述】:

我很难在 ios 上部署动态共享库。

为了隔离和暴露问题,我有一个非常简单的“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 文件。完整的项目可以下载here。我将此报告给Qt as a 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

我希望将解决方案全部嵌入到 QtCreator 中。唯一应该在这里更改的是两个 .pro 文件之一。可能通过对 MACOS 命令的构建后调用...?或者只是 MyApp.pro 中的构建后指令,在部署应用程序之前将 dylib 复制到正确的位置(.app 目标文件夹)?我真的很惊讶 QtCreator 没有默默地涵盖这一点......

注意:This question 建议设置DYLD_LIBRARY_PATH。但我不知道如何在 MyApp.pro 文件中执行此操作,也不知道它对 iOS 部署有何帮助(因为 DYLD_LIBRARY_PATH 可以将 MAC PATH 设置为 lib,而不是将 iPhone PATH 设置为 lib...)

【问题讨论】:

【参考方案1】:

1) 在您的库项目中,确保您的 dylib 具有安装名称 @rpath/mylib.dylib 或类似名称。例如。通过将 QMAKE_SONAME_PREFIX = @rpath 添加到您的库 .pro 文件中。 (您可以通过查看otool -L /path/to/libmylib.dylib 的第一行来检查。如果该库是预构建的 3rdparty 库,则将其更改为 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

【讨论】:

感谢您的回复。我已经很久没有在 MacOS 上工作了......我无法测试你的解决方案,但当我有机会回到这个平台时肯定会!【参考方案2】:

我想出了一个解决方法,以防它可以帮助任何人。

静态而不是动态构建库(将 CONFIG += shared 替换为 CONFIG += staticlib

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

如果您的库仅由程序链接,您就完成了

如果您的库(我们称之为 (A))被另一个库 (B) 使用,那么 (B) 不应再与它链接(B.pro 中没有 LIB 标志)。只有顶层程序会链接到您的所有静态库。

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

【讨论】:

您的目标是什么版本的 iOS?

以上是关于QtCreator for iOS:如何使用我的应用程序部署 dylib 共享库的主要内容,如果未能解决你的问题,请参考以下文章

如何编译使用从不同编译器编译的库的应用程序?

我应该如何配置我的应用以跨类保留 Firebase 用户数据?

如何使用 qtcreator 通过 ninja 构建系统远程部署应用程序

ios 5 模拟我的核心位置

如何在 iOS 中找出我的应用程序的 CPU 利用率、内存使用情况、电池使用情况等

如何使用 QtCreator 调试设备上的应用程序