Копирование предварительно скомпилированных библиотек для создания каталога или добавление их в PATH в проекте QBS

У меня есть сторонняя скомпилированная библиотека (.lib+.dll), которую я использую в своем приложении Qt.

В обычном (qmake) проекте QtCreator у меня есть следующие строки в моем файле.pro:

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

Существует также опция во вкладке "Проекты" -> "Выполнить" -> "Добавить путь поиска библиотеки сборки в PATH", которая по умолчанию включена. Это гарантирует, что путь к LIBS будет добавлен в системную переменную PATH, чтобы можно было найти dll.

Тем не менее, я не могу найти эквивалент в QBS. У меня есть следующий файл QBS, который затем включается и добавляется через Зависит в моем файле 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, который задокументирован здесь, но он не работает.

2 ответа

Я разобрался, как скопировать готовые файлы.dll для сборки dir.

Чего не хватало, так это свойства 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.

Алан, ты на правильном пути. Просто место

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" } из блока экспорта.

Другие вопросы по тегам