gpt4 book ai didi

c++ - CMake "project"指令的正确用法是什么

转载 作者:可可西里 更新时间:2023-11-01 16:35:52 27 4
gpt4 key购买 nike

我有一个很大的代码库,它构建了几十个库和几个可执行文件。

代码库按层级分解,几乎每个级别都构建了库。

我已经完成并在每个目录中放置了一个 CMakeLists.txt 文件来构建每个库。

在每个 CMakeLists.txt 中,我都使用了“project(xxx)”指令。这为我定义了 PROJECT_NAME、PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 变量,我明智地使用了这些变量。

但是,团队中的一个人对这种方法不满意,因为他找不到任何其他人这样做过的真实示例。他经常引用 KitWare 示例作为未使用这种方法,因此我们也不应该。

他提倡的另一种方法是在每个 makefile 中设置这些变量,这看起来很像“项目”给你的东西。

我真的不明白他的意思,而且在说服他不这么认为方面也没有取得什么进展。谁能阐明以这种方式使用项目指令的缺点。

我投身于你们的集体智慧?

最佳答案

首先,它使您能够使用 <projectName>_BINARY_DIR<projectName>_SOURCE_DIR ,但这不是主要优势。如果您给 CMake 一个项目名称,那么它将为每个子项目在它们自己的目录中生成构建目标。这意味着无论您使用的是 GNU Make、Eclipse CDT、XCode 还是任何其他受支持的生成器,您都可以单独构建子项目。例如,使用 GNU Make,每个子项目都有自己的完整构建系统,来自它自己的目录。

可以通过PROJECT_NAME访问当前项目名, 根项目名称为 CMAKE_PROJECT_NAME .

编辑:我刚刚意识到以下将是其任何构建目标的标准 CMake 行为,无论它们是否是项目。我会把它留在这里作为一般信息,但它与答案无关:

假设我有一个 C++ 库,我可以生成三个二进制可执行文件; Maintests/test1 , 和 examples/ex1 .我可以在我从 ALL 目标调用 CMake 的目录中运行 make,运行 make ex1 ,或者我可以将目录更改为 examples/并使用 make 构建示例从那个目录。这将构建所有依赖项目和库,即使它们位于目录结构中的其他位置但不会构建 Maintests/test1或者他们依赖于 examples/ex1 的任何库没有。如果我然后从主目录运行 make,它不会重建任何库 examples/ex1取决于除非他们的来源已经改变。

关于c++ - CMake "project"指令的正确用法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8587224/

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