gpt4 book ai didi

c++ - 有没有办法用 gcc 查询直接的模块依赖关系?

转载 作者:行者123 更新时间:2023-12-04 12:56:23 26 4
gpt4 key购买 nike

给定一个模块

// a-m.cc
export module A;

import B;
import C;

import "D.h";

...
有没有一种方法可以调用 gcc(类似于 -M 对 header 的作用)来列出对其他模块和导入 header (即 B、C 和“D.h”)的直接依赖关系?

最佳答案

[编辑]
似乎我们可以使用标志 -MMD 调用 gcc ,它还跟踪模块依赖性。鉴于我有一个示例项目,我生成它是这样的:

// partition.cpp
export module partition;

import :partition1;
export import :partition2;
export import :partition3;

export void Hello1() { _Hello1(); }
出于某种原因,我需要在编译主模块接口(interface)(如上所示的文件)之前编译模块分区,但也许这可以以某种方式规避。我像这样编译上面的文件:
g++-11 -std=c++20 -fmodules-ts -c -MMD partition.cpp
这会生成一个文件 partition.d列出模块依赖项:
partition.o gcm.cache/partition.gcm: partition.cpp
partition.o gcm.cache/partition.gcm: partition:partition3.c++m \
partition:partition2.c++m partition:partition1.c++m
partition.c++m: gcm.cache/partition.gcm
.PHONY: partition.c++m
gcm.cache/partition.gcm:| partition.o
CXX_IMPORTS += partition:partition3.c++m partition:partition2.c++m \
partition:partition1.c++m
看起来很有希望,但还需要更多的研究。
我自己的解决方案
我已经编写/正在编写这样的工具。它可以在 github 上找到: https://github.com/alexpanter/cpp_module_parser .
它尚未完成,但实际上正在运行。如果有兴趣,我会继续扩大它。
我还有一堆带有模块的小示例项目,旨在作为进一步研究的起点: https://github.com/alexpanter/modules_testing
海湾合作委员会
GCC 在本地目录中查找预编译模块 (BMI): ./gcm.cache/usr/include/c++/11/iostream.gcm或(对于本地模块单元) ./gcm.cache/,/my-module.gcm .
如果用户代码导入一个模块,预编译的模块单元必须已经存在于该目录中,否则编译将失败。
不幸的是(至少目前)无法为每个构建命令指定另一个目录或自定义目录。这将非常实用,我希望 GCC 开发人员会在某个时候添加它。 gcm.cache/目录由默认模块映射器使用。可以创建自己的模块映射器,但从我所做的阅读来看,这听起来像是一个复杂的过程,因为模块映射器本质上是一个 Web 服务器:
  • https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Module-Mapper.html
  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1184r2.pdf

  • 比较
    与@Laserskjöld 的回答相比,我认为收集预处理器输出也是一个可行的解决方案,因为模块导入/导出命令被预处理器识别。但是,我认为这不是一个好的解决方案,因为它比我编写的工具慢得多。一个例子:
    module;

    #include <iostream>

    export module mymodule;

    import myothermodule;

    export
    {
    [...]
    }
    预处理后,此文件将有~100000 行长,所有行都需要由预处理器处理。但是使用我的工具(或可能更高效的工具),模块解析工具只会读取前 9 行,文件的其余部分将被忽略。
    此外,拥有模块的目的是减少对预处理器的依赖。

    关于c++ - 有没有办法用 gcc 查询直接的模块依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66542797/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com