У меня есть сторонняя скомпилированная библиотека (.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, который задокументирован Вот но это не работает
Я разобрался, как скопировать готовые файлы .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" }
вне экспорт блок.