在我们的工作流程,我们可以有一个模块,一个是由几个头文件,模块A不产生任何二进制(旁注:这显然会被其他模块,包括部分标题从使用模块A生成的二进制文件) .
一个很好的例子是一个只有标题的库,由于INTERFACE库的概念,CMake 3引入了很好的支持(参见这个SO答案,以及CMake的特性文档).
我们可以从模块A中创建一个接口库目标:
add_library(module_A INTERFACE)
Run Code Online (Sandbox Code Playgroud)
这为我们提供了CMakes目标的所有优点(可以将其用作另一个目标的依赖,导出它,传递转发需求等)
但在这种情况下,模块A中的标头不会显示在我们的IDE中(Xcode,但我们希望它与大多数/所有其他IDE相同).
这被证明是工作流程中的主要缺点,因为我们需要在IDE中显示组成模块A的文件以进行编辑.是否有可能实现这一目标?
经过大量的努力和研究,我成功地创建了多个 cmake 目标,以将运行我的程序与运行代码测试分开。但我不喜欢我所做的,因为我看到CMakeList.txt文件中有冗余。
目前,我必须将每个新的源文件添加到两个目标,以便源目标可以使用该文件进行构建,并且测试目标可以构建,因为它们需要测试该文件。我无法将整个源目标放入测试目标中,因为这样测试目标将包含两个主文件。
我对如何修复冗余的唯一想法是将源目标中没有文件的所有文件main.cpp放入某个组中,然后将该组附加到两个目标。这样,源目标仅包含main.cpp文件和源文件组,测试目标包含其所有测试和源文件组。因此文件组基本上是两个目标之间的所有重叠部分。我只是不知道该怎么做。
以下是我发现的其他堆栈溢出问题,这些问题帮助我到达了现在的位置:
这是我为试验 catch2 和 cmake 而制作的测试项目,目前适用于构建目标“tests”和“catch2Test”:
/catch2Test // <-- project folder
|---- /include
| |---- /catch2
| |---- catch.hpp
|---- /src
| |---- /myMath
| | |---- factorial.cpp
| | |---- factorial.h
| |---- main.cpp
| |---- CMakeLists.txt
|---- /test
| |---- test_main.cpp
| |---- test_factorial.cpp
| |---- CMakeLists.txt
|---- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
/include/catch2/catch.hpp是catch2的库头文件
/src/myMath/包含阶乘实现的头文件和代码文件,与catch2 教程中使用的相同。这也是阶乘测试的实现的来源。
/src/main.cpp …