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

时间:2015-10-01 14:37:40

标签: c++ ios qt qt-creator 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上,我遇到了同样的问题,可以通过使用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中使用post-build指令在部署应用程序之前将dylib复制到正确的位置(.app目标文件夹)?我真的很惊讶QtCreator没有默默地介绍......

注意:This question建议设置DYLD_LIBRARY_PATH。但我无法在MyApp.pro文件中执行此操作,也不知道如何在iOS部署中提供帮助(因为DYLD_LIBRARY_PATH可以设置为lib的MAC路径,而不是设置到lib的iPhone路径......)

2 个答案:

答案 0 :(得分:3)

1)在您的库项目中,确保您的dylib具有installname @rpath/mylib.dylib等。例如。将QMAKE_SONAME_PREFIX = @rpath添加到您的库.pro文件中 (您可以通过查看otool -L /path/to/libmylib.dylib的第一行来查看。如果该库是预建的第3方,请使用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

答案 1 :(得分:1)

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

  • 静态而不是动态构建您的库(CONFIG += shared

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

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

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

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