Max*_*Max 2 c++ gcc makefile cmake precompiled-headers
我正在使用cmake和C++项目.我想在GCC中使用预编译头文件.
我想运行cmake
一次,然后在运行时make
,我希望这些操作发生:
g++ -c precompiled.h -o precompiled.h.gch
仅当precompiled.h文件在步骤1之后发生更改时,才生成GCC的预编译头文件().我设法添加依赖项,所以每当我构建任何目标时,我的python脚本的目标都会被执行(这很难看,因为现在每个目标都必须依赖于单个global_init目标).此外,我可以修改我的python脚本,因此它不会在没有必要时修改precompiled.h.
但我不知道接下来该做什么.有没有办法告诉cmake它应该运行我的自定义脚本,并确定是否必须创建precompiled.h.gch?现在它始终构建(此文件包含许多#include,因此需要一些时间).基本上:
我在许多地方看过,但是cmake(和make)计算依赖关系的方式似乎太弱而无法完成这项任务.
在这个问题中: 懒惰的c ++ 编译总是在执行lazycpp之后发生.在我的情况下,这不是最佳的.
以下CMake命令可以作为项目的起点:
add_custom_target(scanner COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/scanner.py"
COMMENT "Scanning include files ..."
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
Run Code Online (Sandbox Code Playgroud)
此命令包含第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)
Run Code Online (Sandbox Code Playgroud)
这些命令包括步骤2.预编译的头与它依赖于一个自定义命令生成precompiled.h
和隐式地对其他头precompiled.h
包括.
precompiled.h.gch
在CMAKE_CURRENT_BINARY_DIR
目录中生成.由于预编译的头文件生成需要precompiled.h
由python脚本更新,因此我们在目标上添加目标级别依赖项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)
Run Code Online (Sandbox Code Playgroud)
这些命令添加了生成可执行文件的标准编译步骤main
.预编译头包含在gcc -include
开关的默认头中.在CMAKE_CURRENT_BINARY_DIR
其中包含precompiled.h.gch
加入作为包括目录.precompiled.h.gch
当包含precompiled.h时,gcc 将从那里获取(请参阅使用预编译标头).
最后,目标依赖性generate_precompiled
确保在必要时更新预编译头.