为 CMake 指定单独的头文件而不是完整目录

Specify individual header files for CMake instead of full directory

我在互联网上搜索过,但找不到为我的构建添加单独的包含文件的方法。这不可能吗?我对Make的经验很少,所以我不知道这个限制是否来自Make。

我想要这个的原因是因为我试图在不更改代码本身的情况下对遗留代码库进行单元测试。因此,我试图通过编译注入模拟。为此,我需要我的项目 mix/match 在 'real' 和 'mock' 头文件之间。

作为临时修复,我将头文件放在单独的文件夹中,这个概念证明似乎有效。不过这个方案好像比较丑?

P.S。我正在使用 gtest/gmock,我不想使用他们建议的模板样式依赖注入。

这不是 cmake 或 make 的限制,所有 C++ 编译器都会从排序的文件夹列表中查找 headers,找到第一个 header 文件。

您可以使用包含文件夹参数更改该列表,它们将按照添加的顺序进行搜索。这可能很难实现,因为查找顺序会有所不同,具体取决于您的遗留 header 是使用 #include "file.h" 还是 #include <file.h>。在您的编译器手册或 here.

中阅读更多相关信息

如果您的遗留 header 使用 #include <>

最简单的方法可能是为每个配置在构建文件夹中创建一个自定义包含文件夹,并确保该文件夹具有优先权。然后只复制 mock header 到这个文件夹。

file(COPY test/mymock1.h DESTINATION mock/)
target_include_directories(
  mytest BEFORE
  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/mock
)

如果您的遗留 header 使用 #include ""

你被搞砸了,因为编译器首先在另一个 header 所在的物理文件夹中搜索。你必须确保你的 mock header 替换 non-mock header 在目录中,可能就像您已经在做的那样。