有没有办法使用 gcc 查询直接模块依赖关系?

问题描述

给定一个模块

// a-m.cc
export module A;

import B;
import C;

import "D.h";

...

是否有一种调用 gcc 的方法(类似于 -M 对标头所做的)将列出对其他模块和导入标头(即 B、C 和“D.h”)的直接依赖?

解决方法

我不知道 gcc 有什么方法可以做到这一点,但我建议编写一个帮助程序脚本来扩展文件并查找名为 import 的所有内容,然后您可能需要使用 {{1} 对导入进行排序} 和 " 并将它们作为标题输出。

然后您需要找到导出所选模块的文件以与您的导入匹配。也就是说,您需要浏览展开的文件并查找以 < 开头的语句。

你用

展开文件
export module

g++ -E {include flags,standard version etc} > tmpfile 也适用于 clang++,但对于 msvc,您需要 -E

如果使用 gcc 有一种直接的方法可以做到这一点,我也很想知道,但问题来了:gcc 如何知道在哪里寻找模块?

相反,如果您有一个跟踪每个模块所在位置的构建系统,您可以像使用编译命令一样指定它。 (使用 clang 你用 /E 指定它,我认为它与 gcc 相同,但尚未测试)。至少我在 my build system 中是这样做的。

但总结一下我对你的问题的回答。 我认为您需要:

  • 扩展您的源文件
  • 查找包含 -fmodule-file=importexport import 的所有文件并进行处理。