3

我有一个在我的 Qt 应用程序中使用的第三方预编译库 (.lib+.dll)。

在常规(qmake)QtCreator 项目中,我的 .pro 文件中有以下几行:

LIBS += -L$$PWD/lib/release -ltag
INCLUDEPATH += include/taglib

Projects 选项卡中还有一个选项 -> Run -> “Add build library search path to PATH”,默认为 ON。它确保 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它不起作用。

4

2 回答 2

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

于 2016-09-13T10:26:25.873 回答
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" }离开“导出”块。

于 2017-02-15T21:46:35.723 回答