到目前为止,至少据我所知,在CMake中没有标准的方法来指定以跨平台方式向项目添加预编译头(PCH),因为PCH编译器处理PCH的方式是非常不同的.供应商.对于G ++,这通常是通过简单地添加一个自定义命令来处理,该命令负责使用适当的输入调用编译器并使其生成PCH.
我目前的问题是CMake不会解析您为自定义命令指定的依赖项的依赖项.例如,假设以下结构:
pch.h
|- dependA.h
|- dependB.h
...
Run Code Online (Sandbox Code Playgroud)
仅pch.h作为依赖项提供将导致在相应的目标中生成适当的目标,该目标makefile跟踪对其的更改pch.h.但是,CMake不解析内部 包含pch.h,因此不会识别对dependA.h和的更改dependB.h.如果存在依赖关系等,这会扩展dependsA.h.
注意:我知道PCH依赖关系可以并且确实经常更改这一事实会使整个过程受到质疑.然而,这就是它的方式,我无法对它做任何事情.
由于任务不是太难,因此有一些明显的想法浮现在脑海中:
解决方案A:
手动输入所有依赖项.显然这是有效的,但是地狱般繁琐,根本无法扩展.
解决方案B:
如果可能,编写一个CMake函数来自动执行该过程并"手动"解析包含.
解决方案C:
使用不同的语言(例如Python)执行类似操作,并且只提供CMake要添加到自定义命令的依赖项列表.
解决方案D:
使用gcc/ g++的功能解析并打印出PCH的依赖关系树,并解析输出以提取依赖关系列表.
我的问题是:有没有人知道更方便,更快捷的方法来完成这项工作?
add_custom_commandIMPLICIT_DEPENDS的选项可能会解决问题:
add_custom_command(
OUTPUT outFile
COMMAND ...
IMPLICIT_DEPENDS CXX "pch.h")
Run Code Online (Sandbox Code Playgroud)
该IMPLICIT_DEPENDS选项使生成的构建系统在构建时扫描给定输入文件的隐式依赖项。不过,它仅支持 Makefile 生成器。