CLion 中的嵌套 CMakeLists.txt 文件

Posted

技术标签:

【中文标题】CLion 中的嵌套 CMakeLists.txt 文件【英文标题】:Nested CMakeLists.txt files in CLion 【发布时间】:2020-10-28 17:34:26 【问题描述】:

使用 CLion,我的项目结构如下所示:

您会看到在根目录中有一个include 目录、一个src 目录、一个lib 目录、一个cmake-build-debug 目录、一个CMakeLists.txt 文件(见红色箭头)和一个tests 目录。该项目使用根级 CMakeLists.txt 文件以及各种源文件、头文件和外部文件将共享对象构建到 lib 中。

我可以成功运行根级CMakeList.txt 文件并构建库。到目前为止,一切顺利。

这就是问题所在。除了上述之外,我现在对测试项目中的一些代码感兴趣——在非正式的、探索性的基础上。为此,作为一个初始示例,我创建了一个 test_nnls 目录,其中包含自己的 CMakeLists.txt(见黄色箭头)文件和一个 test_nnls.cpp 文件。 test_nnls.cpp 中的代码创建了一些虚拟数据,调用 src/nnls.cpp 中的函数并打印结果。这里的构建过程只是创建一个执行此操作的可执行文件。这种方法并不意味着成为任何正式测试框架的一部分,我不希望测试作为根级构建的一部分运行。这只是我在整个项目中添加了一个简单的测试程序,我想在我觉得需要的时候独立编译和运行。我计划稍后可能实现一个正式的测试框架,但目前我不知道如何做到这一点,现在只需要打印一些简单的输出来查看所选代码是否正常工作。

问题是我似乎无法执行CMakeLists.txt 文件(黄色箭头)来构建测试。在 CLion 中似乎无法使用 cmake 为测试程序设置构建。我如何构建所有这些以获得我想要的东西?谢谢。

【问题讨论】:

从您的根 CMakeLists.txt 中包含测试,然后通过将 EXCLUDE_FROM_ALL 添加到 add_subdirectory 调用或将所有内容隐藏在 if (TESTING) 块后面来从主构建中排除您的测试程序。 【参考方案1】:

您没有执行CMakeLists.txt。它由 CLion 调用的 cmake(根 CMaksLists.txt 文件)读取。但是,CLion 仅将根 CMaksLists.txt 文件传递​​给 cmake。即使你自己调用 cmake,你也只会传递这个根 CMaksLists.txt 文件。

如果您想在位于其他文件夹的其他CMaksLists.txt 文件中定义目标(或任何内容),则必须将add_subdirectory(folder_name_that_contains_another_CMakeLists_file) 添加到您的根CMaksLists.txt 文件中。只有这样其他CMaksLists.txt 文件中的目标才会出现在 CLion 中。

请注意,一些内容应该出现在根CMaksLists.txt 文件中,但不能出现在其他文件中。特别是,下面两行应该只在根文件中

cmake_minimum_required(VERSION 3.14)  # Choose the minimum cmake version
project(name_of_your_project)

【讨论】:

一旦我在根级别 CMakeLists.txt 文件中添加了您建议的两行,并且 CLion 为较低级别 CMakeLists.txt 中的目标创建了一个单独的目标条目,这是否意味着我可以以某种方式告诉 CLion/cmake 仅遵循较低级别文件中的说明吗?我不想运行根级指令。 我开始怀疑,鉴于我有兴趣将根级文件中指令的运行与较低文件中的指令分开,我是否会更好地移动测试代码和相应的 @987654336 @文件到另一个项目/目录。 将配置分解为多个 CMakeLists.txt 文件更多的是组织问题。一切都是单个项目,这就是为什么只有根CMakeLists.txt 文件应该有这些行。将测试代码放在不同的项目中有什么好处?您可以准确选择要编译和运行 n CLion 的目标。如果您关心目标all,并且不希望将测试目标包含在目标all 中,那么只需将EXCLUDE_FROM_ALL 添加到测试目标中,就像@Botje 的评论中一样。 实际上,经过一番折腾,我现在可以让一切如期进行。我将测试保存在同一个项目中。谢谢。 如果您认为此答案完全回答了您的问题,那么您可以接受。除非还有更多。在这种情况下,您可以在这里发表评论,以便我或其他人可以回答。

以上是关于CLion 中的嵌套 CMakeLists.txt 文件的主要内容,如果未能解决你的问题,请参考以下文章

# Clion中编译多个cpp(实现单文件编译)

CLion 无法将项目识别为 C++14

CLion不承认项目为C ++ 14

CLion+CMake编写C++程序

MPI:更改 CMakelists 中的处理器数量

在 CMakeLists.txt 中链接 GSL