【问题标题】:Compile headers for errors using cmake使用 cmake 编译错误的标头
【发布时间】:2020-01-13 12:07:31
【问题描述】:

背景

我有许多头文件作为库的一部分(称为 A),也可以在其他库的外部使用(称为 C)。

我想编译为 A 部分的编译,以确保标题是独立的。 (目前,这涉及编译 C,如果有问题,重新编译 A 并发布新版本)。

问题

编译标头并丢弃结果的最佳方法是什么?我只对他们的成功编译感兴趣。

我正在考虑将它们复制并重命名为 cpp 文件(这是一个 C++ 项目),然后用它们创建一个库来检查错误。但是有没有更简单的解决方案?

我的目标是命令行等价于

g++ [compile_flags] -c header.hpp

并检查错误但对生成的文件不感兴趣。

我想要一些适用于 cmake 3.13.5(或更早版本)的东西。

谢谢

【问题讨论】:

  • 可能是precompile headers?
  • 我试过了。但它需要 cmake 3.16,而我想要
  • 您的头文件包含内联函数和模板?除非在某处使用它们,否则编译器不会实例化和编译它们。您的库是否有针对这些标头中的代码的测试套件?编译它以检查错误。
  • @Enno 没有模板或内联函数。只是类、结构和其他 POD。如“背景”中所述,这样做的目的是在制作 A 时编译一些头文件,这样我们在编译 C 时就不会失败。不幸的是,测试套件大多是作为 C 构建的一部分完成的,这为时已晚。否则这不是一个严重的问题 - 只是试图在我们的开发周期中节省几分钟。
  • 所以您的目标只是确保这些标头没有丢失的包含或语法错误?在这种情况下,如果你只是从一个空的 .cpp 文件中包含所有它们并编译它,那不会做你想要的吗?

标签: cmake


【解决方案1】:

由于我最近遇到了同样的问题,让我展示一下我的解决方案:

当您列出目标源中的头文件并且仅使用当前路径下方的相对路径(即路径中没有..)时,您可以使用如下函数编译单独的cpphpp 文件的 /em> 文件。

function(check_headers target)
    # build object library used to "compile" the headers
    add_library(${target}_headers OBJECT)
    target_link_libraries(${target}_headers PRIVATE ${target})
    target_include_directories(${target}_headers PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
    # add a proxy source file for each header in the target source list
    get_target_property(TARGET_SOURCES ${target} SOURCES)
    foreach(TARGET_SOURCE ${TARGET_SOURCES})
        if ("${TARGET_SOURCE}" MATCHES ".*\.hpp$")
            set(HEADER_SOURCEFILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_SOURCE}.cpp")
            file(WRITE "${HEADER_SOURCEFILE}" "#include \"${TARGET_SOURCE}\"")
            target_sources(${target}_headers PRIVATE "${HEADER_SOURCEFILE}")
        endif()
    endforeach()
endfunction()

它添加了一个对象库,用于编译给定目标中的每个头文件。

【讨论】:

  • 我最终做了这样的事情(正如我的 cmets 中提到的那样)。需要注意的一件事是需要删除“库”。
  • 我不同意这一点,因为生成的库只是另一个构建工件,例如测试二进制文件等,通常不属于正在使用甚至安装在系统上的内容。此外,库开发人员甚至 CI 作业可能比库用户更经常使用这种头文件自给自足检查,因此一个简单的开/关标志应该消除构建这个的潜在开销(在运行时和空间方面)对象库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多