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 在相同代码上产生内部编译器错误
就我而言,我一起导入了
<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
。请记住,在编译器对其具有稳定支持之前,不要在生产环境中使用此功能。您也可以尝试 功能,这更方便 - 只需要
import std;
语句。