我在C++项目中使用cmake。我想在GCC中使用预编译的 header 。

我想一次运行cmake,然后在运行make时,希望此操作发生:

  • 在整个源代码树上运行我的自定义工具(python脚本)。它在某些子目录中生成precompiled.h header 。目的是扫描* .h和* .cpp中的#include,并将它们移至常见的precompiled.h文件中。
  • 仅在步骤1之后precompiled.h文件已更改时才生成GCC的预编译头文件(g++ -c precompiled.h -o precompiled.h.gch)。
  • 建立过时的目标(在步骤2之后。因为我要使用.gch文件)

  • 我设法添加了依赖关系,因此无论何时构建任何目标,都将执行python脚本的目标(这很丑陋,因为现在每个目标都必须依赖于一个global_init目标)。我也可以修改python脚本,因此在不需要时不会修改precompiled.h。

    但是我不知道下一步该怎么做。有什么办法告诉cmake它应该运行我的自定义脚本,然后确定是否必须创建precompiled.h.gch吗?现在,它始终是构建文件(此文件包含许多#include的文件,因此需要一些时间)。基本上:
  • 执行python脚本-> precompiled.h可能会更新
  • 检查precompiled.h时间戳,如果是新的->构建precompiled.h.gch
  • 标准编译步骤

  • 我看过很多地方,但是cmake(和make)计算依赖关系的方法似乎太弱而无法完成此任务。

    在这个问题上:
    lazy c++
    始终在执行lazycpp之后进行编译。就我而言,这不是最佳选择。

    最佳答案

    以下CMake命令可以作为您项目的起点:

    add_custom_target(scanner COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/scanner.py"
        COMMENT "Scanning include files ..."
        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
    

    此命令涵盖第1步。它调用您的python脚本,该脚本可能会更新precompiled.h中的现有CMAKE_CURRENT_SOURCE_DIR文件。
    add_custom_command(OUTPUT precompiled.h.gch
        COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS}
        -c "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" -o precompiled.h.gch
        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h"
        IMPLICIT_DEPENDS CXX "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h")
    
    add_custom_target(generate_precompiled DEPENDS
        "${CMAKE_CURRENT_BINARY_DIR}/precompiled.h.gch")
    
    add_dependencies(generate_precompiled scanner)
    

    这些命令涵盖了第2步。预编译头是使用定制命令生成的,该命令取决于precompiled.hprecompiled.h包含的其他头上的implicitlyprecompiled.h.gchCMAKE_CURRENT_BINARY_DIR目录中生成。
    由于预编译头的生成需要python脚本更新precompiled.h,因此我们在目标scanner上添加了目标级别的依赖项。
    include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
    
    add_executable(main main.cpp)
    
    set_target_properties(main PROPERTIES COMPILE_FLAGS "-include precompiled.h -H")
    
    add_dependencies(main generate_precompiled)
    

    这些命令添加了标准的编译步骤,这些步骤生成可执行的main。预编译的 header 作为gcc的-include开关的默认 header 包括在内。包含CMAKE_CURRENT_BINARY_DIRprecompiled.h.gch被添加为包含目录。当包含precompiled.h时,gcc将从那里获取precompiled.h.gch(请参阅Using Precompiled Headers)。

    最后,对generate_precompiled的目标依赖关系可确保在必要时更新预编译的 header 。

    关于c++ - 使用cmake有条件地生成源输入文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6649939/

    10-09 05:05