Я работаю над проектом, который имеет несколько уровней. Лично я новичок в qbs, и на внутреннем сайте не так много документов и примеров о qbs.
среда:
Qt5.6.1; Qt Creator 4.01; Ubuntu 16.04; Qbs 1.5.1
Вот иерархия проекта. На верхнем уровне у него есть project.qbs:
import qbs
import qbs.File
Project{
var binaries = [
"component1/component1.qbs",
"component2/component2.qbs",
"subpro/subpro.qbs", // <- 1. the project I am working on
"ourlib/ourlib.qbs", // <- 2. the library I am using
]
return binaries
}
Subpro.qbs выглядит примерно так:
import qbs
Project {
name: subpro
references:[
"app1/app1.qbs""app2/app2.qbs""myapp/myapp.qbs" //<- 3. the application I am working on
]
}
Myapp.qbs похож на:
import qbs
CppApplication{
type: "application"name: "myapp"Group{
name: "project-install"fileTagsFilter: "application"qbs.install: false
qbs.install: "bin"}
Depends {name:"cpp"}
Depends {name:"blah1"}
Depends {name:"ourlib"}
cpp.libraryPaths:["path_of_lib3rdParty"] // 4. set the 3rd party lib path
cpp.staticLibraries:["lib3rdParty.a"] // 5. set the 3rd party lib name
files["myapp.cpp","f2"...]
}
наконец, QBS для нашей библиотеки:
import qbs
DynamicLibrary{
name: "ourlib"Group{
name: "project-install"fileTagsFilter: "dynamiclibrary"qbs.install: false
qbs.installDir: "debug"}
Depends {name: "cpp"}
cpp.includePath:["..."]
cpp.libraryPaths:["path_of_lib3rdParty"] // 6. same as 4
cpp.staticLibraries:["lib3rdParty.a"] // 7. same as 5
}
Когда я запускаю «qbs debug» в корневой папке проекта.
QBS показывает:
linking ourlib.so
compiling myapp.cpp
ERROR: ...
/usr/bin/ld: cannot find -llib3rdParty_s.a
Итак, основываясь на сообщении об ошибке, qbs не удалось собрать myapp.cpp и попытаться найти lib3rdParty в проекте myapp. Я добавил 4 и 5, все еще с той же ошибкой. Кажется, 6 и 7 правильны, так как нет ошибки связывания от ourlib.so. Как мне настроить qbs, чтобы процесс сборки работал?
Другой вопрос по поводу ключевого слова «ссылки». Могу ли я ссылаться на другой файл QBS на любом уровне проекта? Как это работает? Я получил тот же вопрос о «Зависит», а также.
Спасибо
Rong
cpp.dynamicLibraries
а также cpp.staticLibraries
свойства взять список библиотеки имена быть связанными, то есть имя библиотеки без lib
префикс или .so
суффикс.
Например, вы бы использовали:
cpp.libraryPaths: ["/home/r0ng/tools/myapp/libs/relic/lib"]
cpp.dynamicLibraries: ["relic"]
Однако, так как у вас уже есть полный путь к файлу динамической библиотеки, которую вы хотите связать, вы можете просто передать полный путь к файлу без указания cpp.libraryPaths
вообще, вот так:
cpp.dynamicLibraries: ["/home/r0ng/tools/myapp/libs/relic/lib/librelic.so"]
Этот второй метод предпочтителен, потому что он указывает точную библиотеку для ссылки, а не полагается на путь поиска, который не обязательно может выбрать тип библиотеки, которую вы ожидаете (если существует как статическая, так и динамическая версия).
Я признаю, что наш cpp.dynamicLibraries
а также cpp.staticLibraries
свойства должны быть лучше задокументированы, чтобы объяснить их предполагаемое использование.
относительно references
Да, вы можете ссылаться на любой путь к файлу независимо от его расположения в файловой системе.
относительно Depends
этот предмет name
Свойство указывает имя продукта или модуля, от которого создается зависимость. Такой продукт или модуль уже должен присутствовать в дереве вашего проекта, например, был загружен в результате использования qbsSearchPaths
или же references
свойства.
Других решений пока нет …