【问题标题】:Module is not connected during precompilation. C++20预编译期间未连接模块。 C++20
【发布时间】:2021-09-01 07:28:50
【问题描述】:

我有 3 个文件(foo.cppm、foo2.cppm 和 bar.cpp): enter image description here

foo2.cppm:

export module K;

export int sq(int x) {
    return x * x;
}

foo.cppm:

export module M;
import K;

export int f(int x) {
    return 2 + sq(x);
}
export double g(double y, int z) {
    return y * z;
}

bar.cpp:

import M;
import K;

int main() {
    sq(f(5));
    g(0.0, 1);
    return 0;
}

首先,我预编译了 foo2.cppm:

clang++ -fmodules-ts -std=c++20 --precompile foo2.cppm -o K.pcm

enter image description here

然后我尝试预编译 foo.cppm:

clang++ -fmodules-ts -std=c++20 --precompile foo.cppm -o M.pcm

我得到了错误:

foo.cppm:2:8: 致命错误:找不到模块“K”

enter image description here

Clang 版本:12.0.5

enter image description here

这里有什么问题?

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

    模块和预编译不是设计来一起工作的。

    选择一个 - 为了避免更多麻烦,请选择预编译,直到实现更加成熟。

    【讨论】:

    【解决方案2】:

    您可能想尝试以下步骤来编译它

    clang++ -fmodules-ts -std=c++20 --precompile foo2.cppm -o K.pcm
    clang++ -fmodules-ts -std=c++20 --precompile foo.cppm -o M.pcm -fmodule-file=K="K.pcm"
    clang++ bar.cpp --std=c++20 -c -fprebuilt-module-path=.
    clang++ bar.o K.pcm M.pcm -o exe
    ./exe
    

    【讨论】:

    • 当我尝试执行第三步时,我得到:clang:警告:编译期间未使用的参数:'-fprebuilt-module-path=.' [-Wunused-command-line-argument]
    • @ilich 发生这种情况是因为选项-c 表示只编译,不链接,因此任何与链接器相关的命令行参数都将被忽略,因此您会收到该警告。在现实生活中,您的编译器调用提供了一些链接器输入(您可以使用-v 选项签入),因此删除此警告的唯一方法是删除-c(但这会导致编译器错误)
    • 知道了,谢谢,但也许可以做点什么来运行这个例子。
    • @ilich 你的意思是没有警告?我不知道,但是使用此代码,您可以启动您的示例
    • 不,不起作用。我有:致命错误:找不到模块“M”
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2020-10-07
    • 2020-02-23
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多