我有一个 QBS 项目,它是子项目的集合,包括静态库、共享库和 Qt GUI 应用程序。Qt GUI 应用程序一直给我一个问题,即链接阶段失败,为项目链中较早构建的库抛出几个“/usr/bin/ld:找不到{library}:文件格式无法识别”错误。但是,它并不对所有库都这样做,包括与确实引发此错误的库具有几乎相同的 .qbs 文件的库。
奇怪的是,如果我自己构建应用程序,也就是说我从应用程序的项目目录中而不是在顶层运行 qbs,它构建得很好(假设依赖库都存在于它们的安装目录中)。我看到的主要区别是,在构建完整项目时,应用程序的 cpp.libraryPaths 对于项目中的所有产品都被忽略,并且应用程序尝试链接构建目录中生成的 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
}
}