我有一个在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文件中修改或调用该方法。

10-07 13:16