CLion中的嵌套CMakeLists.txt文件

3
使用CLion,我的项目结构看起来像这样:

enter image description here

你会发现在根目录下有一个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设置测试程序的构建。我该如何组织所有这些来达到我的目的?谢谢。

1
将根目录下的CMakeLists.txt中的测试包含进来,然后通过在add_subdirectory调用中添加EXCLUDE_FROM_ALL或者将所有内容隐藏在一个if (TESTING)块后面,从主要构建中排除测试程序。 - undefined
1个回答

4
您不需要执行CMakeLists.txt文件。它是由cmake(根CMaksLists.txt文件)读取的,而CLion调用了它。但是,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只遵循较低级别文件中的指令?我不想运行根级别的指令。 - undefined
我开始怀疑,考虑到我对将根级文件中的指令运行与低级文件中的指令运行分离的兴趣,是否最好将测试代码和相应的 CMakeLists.txt 文件移动到另一个项目/目录中。 - undefined
将配置分成多个CMakeLists.txt文件更多是一种组织方式。一切都是一个单一的项目,这就是为什么只有根目录下的CMakeLists.txt文件应该包含这些行的原因。将测试代码放在不同的项目中有什么好处呢?您可以选择要编译和运行的目标。如果您关心all目标,并且不希望测试目标包含在其中,则只需在测试目标中添加EXCLUDE_FROM_ALL,如@Botje的评论所示。 - undefined
实际上,在进一步摸索后,我现在能够按照期望使一切正常运行了。我将测试保留在同一个项目中。谢谢。 - undefined
如果你认为这个答案完全回答了你的问题,那么你可以接受它。除非还有其他问题。在这种情况下,你可以在这里评论,以便我或其他人可以回答。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接