我有一个在Qt应用程序中使用的第三方预编译库(.lib + .dll)。
在常规(qmake)QtCreator项目中,我的.pro文件中包含以下几行:
LIBS += -L$$PWD/lib/release -ltag
INCLUDEPATH += include/taglib
默认情况下,“项目”选项卡->运行->“将构建库搜索路径添加到PATH”中还有一个选项。它确保将LIBS路径添加到系统PATH,以便可以找到dll。
但是,我在QBS中找不到等效项。我有以下qbs文件,该文件随后通过Depends包含并添加到我的CppApplication文件中:
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中,但是它不起作用。
最佳答案
我想出了如何复制预构建的.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文件中修改或调用该方法。