我已经构建了一个应用程序,该应用程序加载了一个自制的.dylib,而该.dylib必须调用另一个.dylib。
我在OS X上使用Qt。当我进入Qt Creator时,我可以进行调试/发布,并且可以正常工作。当我单击.app和应用程序位于.app / Contents / Frameworks中的所有.dylib时,它也起作用。我的问题是部署。当我运行macdeployqt时,所有工作都会生成一个.dmg,但是当我启动此.dmg时,会发生错误。
此错误是逻辑上的,因为由主.dylib调用的.dylib不在.app / Contents / Frameworks文件夹中。如果我在此文件夹中添加它,我不知道如何添加它失败。这也是合乎逻辑的,因为该应用程序不调用第二个.dylib,而是主dylib。没有应用程序文件夹,所以...
使用该macdeployqt
工具之前,必须将所需的库复制到应用程序捆绑包中。您可以通过添加主要目标所依赖的自定义目标,从应用程序本身的项目文件中执行复制。这些目标将是dylib的副本,您将从构建目录中的其他位置复制它们。
通常,您将有一个顶级子目录项目来构建库和应用程序,例如:
+--- lib-dylib-32920629
+--- lib-dylib-32920629.pro
+--- lib1
| +--- lib1.pro
| +--- lib1.cpp
| \--- lib1.h
\--- main
+--- main.pro
\--- main.cpp
从以下位置下载此项目:https : //github.com/KubaO/stackoverflown/tree/master/questions/lib-dylib-39206929
TEMPLATE = subdirs
SUBDIRS += lib1 main
main.depends += lib1
QT = core
CONFIG += c++11
TEMPLATE = lib
HEADERS += lib1.h
SOURCES += lib1.cpp
#ifndef LIB1_H
#define LIB1_H
#include <QObject>
class Lib1 {
public:
QString text();
};
#endif
#include "lib1.h"
QString Lib1::text() {
return QStringLiteral("Hello from Lib1");
}
deployLib
可以使用自定义函数将库部署到应用程序捆绑包中:
QT = widgets
CONFIG += c++11
TEMPLATE = app
SOURCES += main.cpp
LIBS += -L../lib1 -llib1
INCLUDEPATH += ..
DEPENDPATH += ..
defineReplace(libVersions) {
# libVersions(1,2,3) - returns .1.2.3. .1.2. .1. .
versions=.$${1}.$${2}.$${3}. .$${1}.$${2}. .$${1}. .
return($$versions)
}
defineReplace(dylibs) {
# dylibs(base,1,2,3) - returns libbase.1.2.3.dylib libbase.1.2.dylib ... libbase.dylib
base = $$1
versions = $$libVersions("$$2","$$3","$$4")
libs =
for (version, versions): libs += lib$${base}$${version}dylib
return($$libs)
}
defineTest(deployLib) {
# deployLib(target,target2path,target2,1,2,3)
# deploys target2path/libtarget2.1.2.3.dylib,... to the target's application bundle
target = $$1
libpath = $$2
libtarget = $$3
libs = $$dylibs($$libtarget,$$4,$$5,$$6)
targetdir = $${target}.app/Contents/MacOS
mktargetdir = "(test -d $$targetdir/ || mkdir -p $$targetdir/)"
for (lib, libs) {
out = $$targetdir/$$lib
$${lib}.target = $$out
$${lib}.commands = $$mktargetdir
$${lib}.commands += "&& $$QMAKE_COPY_FILE $$libpath/$$libtarget/$$lib $$out"
export($${lib}.target)
export($${lib}.commands)
QMAKE_EXTRA_TARGETS += $$lib
PRE_TARGETDEPS += $$out
}
export(QMAKE_EXTRA_TARGETS)
export(PRE_TARGETDEPS)
return(true)
}
macx {
deployLib(main, .., lib1, 1, 0, 0)
}
#include "lib1/lib1.h"
#include <QtWidgets>
int main(int argc, char ** argv) {
QApplication app{argc, argv};
Lib1 lib1;
QLabel label{lib1.text()};
label.setMinimumSize(200, 200);
label.setFont(QFont{"Helvetica", 20});
label.show();
return app.exec();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句