У меня есть проект QBS, который представляет собой набор подпроектов, включая статические библиотеки, общие библиотеки и приложения Qt GUI. Приложение Qt GUI вызывало у меня проблему в том, что этап связывания завершился неудачно, выдав несколько ошибок «/ usr / bin / ld: not find {library}: Формат файла не распознан» для библиотек, которые были построены ранее в цепочке проектов. Это не делает это для всех библиотек, включая библиотеки с почти идентичными файлами .qbs, которые выдают эту ошибку.
Как ни странно, если я создаю приложение самостоятельно, то есть запускаю qbs из директории проекта приложения, а не на верхнем уровне, он прекрасно работает (при условии, что все зависимые библиотеки существуют в своих установочных каталогах). Основное различие, которое я вижу, состоит в том, что при сборке полного проекта cpp.libraryPath для приложения игнорируются для всех продуктов в проекте, и приложение пытается связываться с файлами lib, созданными в каталоге сборки, при сборке приложения на его собственные cpp.libraryPaths используются по назначению, а файлы в каталоге установки успешно связаны.
Я понятия не имею, почему файлы lib в каталоге установки могут быть связаны, в то время как файлы в каталоге сборки выдают ошибки. Что может быть причиной сбоя ссылки в первую очередь? Кроме того, как я могу исправить конфигурацию своего проекта, чтобы я мог собрать все, вызвав qbs на верхнем уровне. Возможно, я поступаю неправильно?
Вот команда, которую я использую для запуска сборки:
qbs qbs.installRoot:. release
И наглядное представление вопроса:
Poject <-- calling qbs here throws errors at linking application
|- LibraryOne
|- LibraryTwo
|- Application <-- calling qbs here works if libraries already built
А вот очень упрощенное воспроизведение соответствующих файлов QBS
-- SubOne.qbs and SubTwo --
// These are identical excluding the files
StaticLibrary {
name: // "One" or "Two"files: [/*Files...*/]
Depends {
name: "Qt"submodules: [/*core, etc...*/]
}
Depends { name: "cpp" }
// cpp depends and properties
Group {
fileTagsFilter: product.type
qbs.installDir: "lib"qbs.install: true
}
}
-- App.qbs --
QtGuiApplication {
name: "App"files: [/*Files...*/]
Depends { name: "One" } // I comment out these depends when building the Application on it's own
Depends { name: "Two" }
Depends { name: "cpp" }
cpp.includePaths: ["../One/include","..Two/include"]
cpp.libraryPaths: ["../lib"] // <-- Ignored during full project build
cpp.staticLibraries: ["One","Two"]
Group {
fileTagsFilter: product.type
qbs.installDir: "bin"qbs.install: true
}
}
Никогда не запускайте qbs из подкаталога. Вам следует всегда запустите его в файле проекта верхнего уровня. В вашей корневой директории у вас должен быть такой файл:
// project.qbs
import qbs
Project {
// order doesn't matter here
references: [
"LibraryOne/SubOne.qbs",
"LibraryTwo/SubTwo.qbs",
"Application/App.qbs"]
}
Во-вторых, вы не должны устанавливать cpp.libraryPaths
а также cpp.staticLibraries
в вашем приложении, поскольку элементы Зависит, которые есть в вашем приложении, уже будут обрабатывать это (никогда не закомментируйте их).
Ваш cpp.includePaths
свойства также не должны быть установлены в приложении, вместо этого они должны входить в экспорт элемент в каждой из ваших статических библиотек, например:
StaticLibrary {
...
Export {
Depends { name: "cpp" }
cpp.includePaths: [product.sourceDirectory + "/include"]
}
...
}
Тогда беги qbs -f project.qbs
и все должно быть построено правильно.
Других решений пока нет …