gpt4 book ai didi

c++ - 将应用程序构建为产品集合的一部分时出现错误 "/usr/bin/ld: cannot find library: File format not recognized"

转载 作者:行者123 更新时间:2023-11-30 03:35:33 26 4
gpt4 key购买 nike

我有一个 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
}
}

最佳答案

切勿从子目录运行 qbs。您应该始终在顶级项目文件上运行它。在您的根目录中,您应该有一个这样的文件:

// project.qbs
import qbs

Project {
// order doesn't matter here
references: [
"LibraryOne/SubOne.qbs",
"LibraryTwo/SubTwo.qbs",
"Application/App.qbs"
]
}

其次,您不应该在应用程序中设置 cpp.libraryPathscpp.staticLibraries,因为应用程序中的 Depends 项已经处理了这个问题(永远不要将它们注释掉)。

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

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

然后运行 ​​qbs -f project.qbs 一切都应该正确构建。

关于c++ - 将应用程序构建为产品集合的一部分时出现错误 "/usr/bin/ld: cannot find library: File format not recognized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41227111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com