我有一个QBS项目,它是子项目的集合,包括静态库,共享库和Qt GUI应用程序。 Qt GUI应用程序一直给我的问题是链接阶段失败,抛出几个“/ usr / bin / ld:找不到{library}:文件格式无法识别”项目链中早期构建的库的错误。但是它不会对所有库执行此操作,包括具有与引发此错误的文件几乎相同的.qbs文件的库。
奇怪的是,如果我自己构建应用程序,也就是说我从应用程序的项目目录而不是顶层运行qbs,它构建正常(假设依赖库都存在于其安装目录中) 。我看到的主要区别是,在构建完整项目时,项目中的所有产品都会忽略应用程序的cpp.libraryPaths,并且应用程序尝试链接构建目录中生成的lib文件,而在构建应用程序时它是自己的cpp.libraryPaths按预期使用,并且安装目录中的文件成功链接。
我不知道为什么安装目录中的lib文件可以链接到build目录中的文件抛出错误。什么可能导致链接首先失败?另外,我如何修复我的项目配置,以便通过在顶层调用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
}
}
答案 0 :(得分:2)
永远不要从子目录运行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
,因为您在应用程序中拥有的Depends项目已经处理过这个问题(永远不会将它们注释掉)。
您的cpp.includePaths
属性也不应该在应用程序中设置,而应该进入每个静态库中的Export项,如下所示:
StaticLibrary {
...
Export {
Depends { name: "cpp" }
cpp.includePaths: [product.sourceDirectory + "/include"]
}
...
}
然后运行qbs -f project.qbs
,一切都应该正确构建。