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 文件的主要内容,如果未能解决你的问题,请参考以下文章