我在网上看到了一些(老的)帖子,关于在CMake中对预编译头文件的一些支持。它们看起来都有点无处不在,每个人都有自己的方式。目前最好的方式是什么?
发布于 2012-03-23 19:46:22
对于基于CMake的构建系统,有一个third party CMake module named 'Cotire'可以自动使用预编译头文件,也支持unity构建。
发布于 2009-09-04 15:46:04
我正在使用下面的宏来生成和使用预编译头:
MACRO(ADD_MSVC_PRECOMPILED_HEADER PrecompiledHeader PrecompiledSource SourcesVar)
IF(MSVC)
GET_FILENAME_COMPONENT(PrecompiledBasename ${PrecompiledHeader} NAME_WE)
SET(PrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${PrecompiledBasename}.pch")
SET(Sources ${${SourcesVar}})
SET_SOURCE_FILES_PROPERTIES(${PrecompiledSource}
PROPERTIES COMPILE_FLAGS "/Yc\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\""
OBJECT_OUTPUTS "${PrecompiledBinary}")
SET_SOURCE_FILES_PROPERTIES(${Sources}
PROPERTIES COMPILE_FLAGS "/Yu\"${PrecompiledHeader}\" /FI\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\""
OBJECT_DEPENDS "${PrecompiledBinary}")
# Add precompiled header to SourcesVar
LIST(APPEND ${SourcesVar} ${PrecompiledSource})
ENDIF(MSVC)
ENDMACRO(ADD_MSVC_PRECOMPILED_HEADER)
假设您有一个包含所有源文件的变量${MySources},您想要使用的代码应该是
ADD_MSVC_PRECOMPILED_HEADER("precompiled.h" "precompiled.cpp" MySources)
ADD_LIBRARY(MyLibrary ${MySources})
代码在非MSVC平台上仍然可以很好地工作。相当整洁:)
发布于 2019-08-30 03:13:18
CMake刚刚获得了对PCH(预编译头)的支持,它应该会在即将到来的3.16版本中可用,截止日期为2019-10-01:
https://gitlab.kitware.com/cmake/cmake/merge_requests/3553
target_precompile_headers(<target>
<INTERFACE|PUBLIC|PRIVATE> [header1...]
[<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])
关于支持在目标之间共享PCH的讨论正在进行中:https://gitlab.kitware.com/cmake/cmake/issues/19659
在https://blog.qt.io/blog/2019/08/01/precompiled-headers-and-unity-jumbo-builds-in-upcoming-cmake/上有一些额外的上下文(动机,数字)可用
https://stackoverflow.com/questions/148570
复制相似问题