clang++ 错误:模块 () 中的 () 不存在于模块 () 中 () 的定义中

问题描述 投票:0回答:1

Clang 和 libc++ 版本:15.0.7

来源

as.cppm:

export module as;
import <boost/asio.hpp>;
// import <iostream>;
export int main() {
}

编译

(需要增强库)

clang++ -std=c++20 -stdlib=libc++ --precompile -xc++-system-header boost/asio.hpp
#Produces `asio.pcm`
clang++ -std=c++20 -stdlib=libc++ --precompile as.cppm -fmodule-file=asio.pcm
#Produces `as.pcm`

一切顺利

但是如果我取消注释第 3 行

来源:

as.cppm:

export module as;
import <boost/asio.hpp>;
import <iostream>;
export int main() {
}

编译

(需要增强库)

clang++ -std=c++20 -stdlib=libc++ --precompile -xc++-system-header boost/asio.hpp
#Produces `asio.pcm`
clang++ -std=c++20 -stdlib=libc++ --precompile -xc++-system-header iostream
#Produces `iostream.pcm`
clang++ -std=c++20 -stdlib=libc++ --precompile as.cppm -fmodule-file=asio.pcm -fmodule-file=iostream.pcm
#Error

错误

粘贴箱

为什么会产生这样的错误消息?我在谷歌上找不到类似的。

g++ 12.2 在相同代码上产生内部编译器错误

c++ boost clang c++20 c++-modules
1个回答
0
投票
我也遇到过和你类似的问题。

就我而言,我一起导入了

<format>

<iostream>

$ clang++-18 -std=c++26 -x c++-system-header format iostream -stdlib=libc++ # Produces `format.pcm` and `iostream.pcm` $ clang++-18 -std=c++26 -fmodule-file=format.pcm -fmodule-file=iostream.pcm -x c++ - -stdlib=libc++ import <format>; import <iostream>; int main() { std::cout << std::format("clang {}\n", __clang_major__); } # Many errors like this: /usr/lib/llvm-18/bin/../include/c++/v1/string_view:344:5: error: 'std::basic_string_view<char>::basic_string_view' from module '/usr/lib/llvm-18/bin/../include/c++/v1/iostream' is not present in definition of 'std::string_view' in module '/usr/lib/llvm-18/bin/../include/c++/v1/format'
在这种情况下,罪魁祸首是

<string_view>

。由于 
<format>
<iostream>
 都直接或间接包含 
<string_view>
,单独生成 
format.pcm
iostream.pcm
 可能会扰乱依赖关系,导致解析 
import <format>;
import <iostream>;
 时 ODR 检查和声明合并出现问题。 (参见
官方文档

临时解决方法可能是先生成

string_view.pcm

,然后基于 
format.pcm
 生成 
iostream.pcm
string_view.pcm

$ clang++-18 -std=c++26 -x c++-system-header string_view -stdlib=libc++ # Produces `string_view.pcm` $ clang++-18 -std=c++26 -fmodule-file=string_view.pcm -x c++-system-header format iostream -stdlib=libc++ # Produces `format.pcm` and `iostream.pcm` (with the same `string_view.pcm` dependency) $ clang++-18 -std=c++26 -fmodule-file=format.pcm -fmodule-file=iostream.pcm -x c++ - -stdlib=libc++ import <format>; import <iostream>; int main() { std::cout << std::format("clang {}\n", __clang_major__); } # Produces `a.out` $ ./a.out clang 18
在您的情况下,您可以先生成 

stdexcept.pcm

,然后根据 
asio.pcm
 生成 
iostream.pcm
stdexcept.pcm

请记住,在编译器对其具有稳定支持之前,不要在生产环境中使用此功能。您也可以尝试

Standard Library Modules

 功能,这更方便 - 只需要 import std;
 语句。

© www.soinside.com 2019 - 2024. All rights reserved.