rni*_*ckb 6 c++ gcc c++20 c++-modules
给定一个模块
// a-m.cc
export module A;
import B;
import C;
import "D.h";
...
Run Code Online (Sandbox Code Playgroud)
有没有一种调用 gcc 的方法(类似于 -M 对标头所做的操作)来列出对其他模块和导入标头(即 B、C 和“Dh”)的直接依赖项?
看来我们可以使用 flag 调用 gcc -MMD,它还跟踪模块依赖关系。给定一个我拥有的示例项目,我是这样生成的:
// partition.cpp\nexport module partition;\n\nimport :partition1;\nexport import :partition2;\nexport import :partition3;\n\nexport void Hello1() { _Hello1(); }\nRun Code Online (Sandbox Code Playgroud)\n由于某种原因,我需要在编译主模块接口(上面显示的文件)之前编译模块分区,但也许可以以某种方式规避这一点。我这样编译上面的文件:
\ng++-11 -std=c++20 -fmodules-ts -c -MMD partition.cpp\nRun Code Online (Sandbox Code Playgroud)\n这会生成一个partition.d列出模块依赖项的文件:
partition.o gcm.cache/partition.gcm: partition.cpp\npartition.o gcm.cache/partition.gcm: partition:partition3.c++m \\\n partition:partition2.c++m partition:partition1.c++m\npartition.c++m: gcm.cache/partition.gcm\n.PHONY: partition.c++m\ngcm.cache/partition.gcm:| partition.o\nCXX_IMPORTS += partition:partition3.c++m partition:partition2.c++m \\\n partition:partition1.c++m\nRun Code Online (Sandbox Code Playgroud)\n看起来很有希望,但还需要更多的研究。
\n我已经编写/正在编写这样一个工具。它可以在 github 上找到: https: //github.com/alexpanter/cpp_module_parser。
\n它尚未完成,但实际上正在发挥作用。如果有兴趣,我会继续扩大它。
\n我还有一组带有模块的小型示例项目,旨在作为进一步研究的起点: https: //github.com/alexpanter/modules_testing
\nGCC 在本地目录中查找预编译模块 (BMI\'s):./gcm.cache/usr/include/c++/11/iostream.gcm或 (对于本地模块单元) ./gcm.cache/,/my-module.gcm。
如果用户代码导入模块,则预编译的模块单元必须已存在于该目录中,否则编译将失败。\n不幸的是(至少目前)不可能为每个构建命令指定另一个目录或自定义目录。这将非常实用,我希望 GCC 开发人员能够在某个时候添加它。这gcm.cache/目录由默认模块映射器使用。可以创建自己的模块映射器,但从我所做的阅读来看,这听起来像是一个复杂的过程,因为模块映射器本质上是一个 Web 服务器:
与 @Laserskj\xc3\xb6ld\ 的答案相比,我认为收集预处理器输出也是一个可行的解决方案,因为模块导入/导出命令可以被预处理器识别。但是,我认为这不是一个好的解决方案,因为它比我编写的工具慢得多。一个例子:
\ng++-11 -std=c++20 -fmodules-ts -c -MMD partition.cpp\nRun Code Online (Sandbox Code Playgroud)\n预处理后,该文件将有约 100000 行长,并且所有行都需要由预处理器处理。但是使用我的工具(或者可能更高效的工具),模块解析工具只会读取前 9 行,文件的其余部分将被忽略。 \n此外,拥有模块的目的是减少依赖在预处理器上。
\n| 归档时间: |
|
| 查看次数: |
1192 次 |
| 最近记录: |