10

到目前为止,至少据我所知,CMake 中还没有标准的方法来指定以跨平台方式将预编译头 (PCH) 添加到项目中,因为 C++ 编译器处理 PCH 的方式非常不同供应商。对于 G++,这通常可以通过简单地添加一个自定义命令来解决,该命令负责使用适当的输入调用编译器并让它生成 PCH。

我当前的问题是 CMake 不会解析您为自定义命令指定的依赖项的依赖项。例如,假设以下结构:

pch.h
 |- dependA.h
 |- dependB.h
 ...

仅提供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 的依赖树,解析输出提取依赖列表。

我的问题是:有谁知道更方便快捷的方法来完成这项工作?

4

1 回答 1

4

add_custom_commandIMPLICIT_DEPENDS选项可能会解决问题:

add_custom_command(
    OUTPUT outFile
    COMMAND ...
    IMPLICIT_DEPENDS CXX "pch.h")

IMPLICIT_DEPENDS选项使生成的构建系统在构建时扫描给定输入文件的隐式依赖项。不过,它仅支持 Makefile 生成器。

于 2013-10-14T19:13:36.663 回答