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

标签 c++ cmake

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

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

我已经完成并在每个目录中放置了一个 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/

相关文章:

android - 警告 : shared library text segment is not shareable

c++ - 使用 cmake 和 Qt4 进行 make 时出现 RCC 解析错误

c++ - 如何将使用 git 和 CMake 的外部库依赖项惯用地添加到 git 和 CMake 项目中?

c++ - 使用 --ppapi-out-of-process 标志时,visual studio 调试器是否仍可用于调试 ppapi 受信任的插件?

c++ - 如何编写不立即将控制权释放给调用应用程序的 Windows 应用程序

c++ - 在 Qt 应用程序中诊断段错误时遇到问题

C++将 vector 保存/加载到文件

c++ - 将模板函数作为普通函数的参数传递

macos - 使用 CPack,在 OSX 上构建时,如何避免在包/ bundle 文件名中出现后缀 Darwin?

树莓派的交叉编译——包括来自同步文件系统的库