【问题标题】:Specify individual header files for CMake instead of full directory为 CMake 指定单个头文件而不是完整目录
【发布时间】:2020-07-14 12:06:32
【问题描述】:

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

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

作为临时修复,我将头文件放在单独的文件夹中,这个概念证明似乎有效。但是,这个解决方案似乎相当难看?

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

【问题讨论】:

    标签: unit-testing cmake compilation header include


    【解决方案1】:

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

    您可以使用包含文件夹参数更改该列表,它们将按添加顺序进行搜索。这可能很难实现,因为根据您的旧标头使用#include "file.h" 还是#include <file.h>,查找顺序会有所不同。在您的编译器手册或here 中阅读更多相关信息。

    如果您的旧标头使用 #include <>

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

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

    如果您的旧标头使用 #include ""

    您搞砸了,因为编译器首先在物理文件夹中搜索另一个头文件。您必须确保您的模拟头文件替换目录中的非模拟头文件,可能就像您已经在做的那样。

    【讨论】:

    • 感谢您的信息!很高兴知道这是一个编译器限制,所以我知道我必须以某种方式解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多