将预编译库复制到构建目录或将其添加到QBS项目中的PATH

时间:2016-09-13 09:47:23

标签: c++ qt taglib qbs

我有一个第三方预编译库(.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,但它不起作用。

2 个答案:

答案 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" }移出导出块。