我有一个第三方预编译库(.lib + .dll),我在我的Qt应用程序中使用。
在常规(qmake)QtCreator项目中,我的.pro文件中包含以下行:
LIBS += -L$$PWD/lib/release -ltag
INCLUDEPATH += include/taglib
“项目”标签中还有一个选项 - >运行 - > "将构建库搜索路径添加到PATH"默认为ON。它确保LIBS路径被添加到系统PATH,因此可以找到dll。
但是,我无法在QBS中找到相应的内容。我有以下qbs文件,然后通过我的CppApplication文件中的Depends包含并添加:
DynamicLibrary {
name: "taglib"
files: "lib/release/tag.dll"
Export {
Depends { name: "cpp" }
cpp.includePaths: [".","include/taglib"]
cpp.libraryPaths: ["lib/release"]
cpp.dynamicLibraries: "tag"
}
Group {
name: "taglib"
fileTagsFilter: ["dynamicLibrary"]
qbs.install: true
}
}
链接器通过,但应用程序无法在运行时找到DLL并崩溃。 是否可以在运行时将cpp.libraryPaths添加到系统PATH?
另一个选择是将DLL文件复制到构建目录,但我无法弄清楚如何在QBS中为预编译库执行此操作。
编辑:我尝试使用cpp.systemRunPaths,其中记录了here,但它不起作用。
答案 0 :(得分:2)
我想出了如何复制预建的.dll文件来构建目录。
缺少的是FileTagger属性,因为QBS似乎没有考虑.dll文件动态库。
FileTagger {
patterns: ["*.dll"]
fileTags: ["dynamicLibrary"]
}
问题仍然在于如何在运行时将cpp.libraryPaths添加到系统PATH。我在core.qbs中找到了以下方法:
setupRunEnvironment: {
var env;
if (qbs.targetOS.contains('windows')) {
env = new ModUtils.EnvironmentVariable("PATH", qbs.pathListSeparator, true);
env.append(binPath);
env.set();
}
...
}
我不知道如何在我的QBS文件中修改或调用该方法。
答案 1 :(得分:1)
阿兰,你的正确方式。只需放置
setupRunEnvironment: {
var env;
if (qbs.targetOS.contains('windows')) {
env = new ModUtils.EnvironmentVariable("PATH", qbs.pathListSeparator, true);
env.append(binPath);
env.set();
}
}
位于DynamicLibrary {}
块中,位于最后Group {}
下方。更改 binPath 以指向包含共享库的文件夹。这至少适用于Windows。
也许您需要将Depends { name: "cpp" }
移出导出块。