Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用cmake编译错误的标题_Cmake - Fatal编程技术网

使用cmake编译错误的标题

使用cmake编译错误的标题,cmake,Cmake,背景 我有许多头作为库的一部分(称为a),也从其他库外部使用(称为C) 我希望编译为A部分的编译,以确保头是自包含的。(目前,这涉及编译C,如果有问题,请重新编译A并发布新版本) 问题 编译头并丢弃结果的最佳方法是什么?我只对他们的成功编纂感兴趣 我想复制并重命名它们作为CPP文件(它是C++项目),然后从它们中创建一个库来检查错误。但有更简单的解决方案吗 我的目标是使命令行相当于 g++ [compile_flags] -c header.hpp 并检查错误,但对生成的文件不感兴趣 我想要一

背景

我有许多头作为库的一部分(称为a),也从其他库外部使用(称为C)

我希望编译为A部分的编译,以确保头是自包含的。(目前,这涉及编译C,如果有问题,请重新编译A并发布新版本)

问题

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

我想复制并重命名它们作为CPP文件(它是C++项目),然后从它们中创建一个库来检查错误。但有更简单的解决方案吗

我的目标是使命令行相当于

g++ [compile_flags] -c header.hpp
并检查错误,但对生成的文件不感兴趣

我想要一些与cmake 3.13.5(或更老版本)一起工作的东西


谢谢

因为我最近遇到了同样的问题,让我展示一下我采用的解决方案:

当您列出目标源中的头文件并仅使用当前路径下的相对路径(即路径中的no
)时,您可以使用如下函数为每个hpp文件编译单独的cpp文件


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

可能吧?我试过了。但它需要cmake 3.16,而我希望头文件中包含内联函数和模板?编译器不会实例化和编译它们,除非它们在某个地方使用。您的库是否为这些头中的代码提供了测试套件?编译它以检查错误。@Enno没有模板或内联函数。只有类、结构和其他pod。正如“背景”中所指出的,这是为了在编译时编译一些头文件,这样我们在编译C时就不会以失败告终。不幸的是,测试套件大部分是作为C构建的一部分完成的,这已经太晚了。否则,这不是一个严重的问题-只是试图在开发周期中节省几分钟。所以您的目标仅仅是确保这些头没有丢失的include或语法错误?在这种情况下,如果您只是从一个空的.cpp文件中包含所有这些文件并进行编译,这不会满足您的需要吗?我最终做了类似的事情(正如我在评论中提到的)。需要注意的一点是,需要删除“库”。我不同意这一点,因为生成的库只是另一个构建工件,如测试二进制文件等,通常不属于正在使用的部分,甚至不属于以后安装在系统上的部分。此外,与库用户相比,库开发人员甚至CI作业可能更经常使用这样的头自给自足检查,因此简单的开/关标志应该消除构建此对象库的潜在开销(在运行时和空间方面)。
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()