C++ “错误”/usr/bin/ld:找不到库:无法识别文件格式";当应用程序作为产品集合的一部分构建时

C++ “错误”/usr/bin/ld:找不到库:无法识别文件格式";当应用程序作为产品集合的一部分构建时,c++,qt,qbs,C++,Qt,Qbs,我有一个QBS项目,它是子项目的集合,包括静态库、共享库和QtGUI应用程序。Qt-GUI应用程序给我带来了一个问题,链接阶段失败,引发了几个“/usr/bin/ld:not find{library}:File format not recognized”错误,这些错误是在项目链早期构建的库出现的。但是,它并不是对所有库都这样做,包括具有与抛出此错误的库几乎相同的.qbs文件的库 奇怪的是,如果我自己构建应用程序,也就是说,我从应用程序的项目目录而不是顶层运行qbs,那么它构建得很好(假设依赖

我有一个QBS项目,它是子项目的集合,包括静态库、共享库和QtGUI应用程序。Qt-GUI应用程序给我带来了一个问题,链接阶段失败,引发了几个“/usr/bin/ld:not find{library}:File format not recognized”错误,这些错误是在项目链早期构建的库出现的。但是,它并不是对所有库都这样做,包括具有与抛出此错误的库几乎相同的.qbs文件的库

奇怪的是,如果我自己构建应用程序,也就是说,我从应用程序的项目目录而不是顶层运行qbs,那么它构建得很好(假设依赖库都存在于它们的安装目录中)。我看到的主要区别是,在构建完整项目时,项目中的所有产品都会忽略应用程序的cpp.librarypath,应用程序会尝试链接到构建目录中生成的lib文件,而在自己构建应用程序时,会按预期使用cpp.librarypath,并成功链接安装目录中的文件

我不知道为什么安装目录中的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

Poject永远不要从子目录运行qbs。您应该始终在顶级项目文件上运行它。在根目录中,您应该有如下文件:

// project.qbs
import qbs

Project {
    // order doesn't matter here
    references: [
        "LibraryOne/SubOne.qbs",
        "LibraryTwo/SubTwo.qbs",
        "Application/App.qbs"
    ]
}
其次,您不应该在应用程序中设置
cpp.librarypath
cpp.staticLibraries
,因为应用程序中的依赖项已经可以处理这个问题(永远不要注释掉它们)

您的
cpp.includePaths
属性也不应该在应用程序中设置,而是应该放在每个静态库中的一个项目中,如下所示:

StaticLibrary {
    ...
    Export {
        Depends { name: "cpp" }
        cpp.includePaths: [product.sourceDirectory + "/include"]
    }
    ...
}
然后运行
qbs-f project.qbs
,所有内容都应该正确构建

StaticLibrary {
    ...
    Export {
        Depends { name: "cpp" }
        cpp.includePaths: [product.sourceDirectory + "/include"]
    }
    ...
}