编译Clang官方C++20模块示例后运行触发段错误求助
C++20模块运行触发段错误的解决方法
编译Clang官方文档的C++20模块最小示例后,运行生成的二进制文件触发段错误,相关信息如下:
模块代码(Hello.cppm)
// Hello.cppm module; #include <iostream> export module Hello; export void hello() { std::cout << "Hello World!" << std::endl; }
主文件代码(use.cpp)
// use.cpp import Hello; int main() { hello(); return 0; }
编译命令
$ clang --version clang version 14.0.6 Target: x86_64-pc-linux-gnu Thread model: posix InstalledDir: /usr/bin $ clang++ -std=c++20 --precompile Hello.cppm -o Hello.pcm $ clang++ -std=c++20 use.cpp -fprebuilt-module-path=. Hello.pcm -o Hello.out
LLDB调试输出
$ lldb ./Hello.out (lldb) target create "./Hello.out" Current executable set to '/home/cwd/Hello.out' (x86_64). (lldb) run Process 160768 launched: '/home/cwd/Hello.out' (x86_64) Process 160768 stopped * thread #1, name = 'Hello.out', stop reason = signal SIGSEGV: invalid address (fault address: 0xffffffffffffffe8) frame #0: 0x00007ffff7e8168a libstdc++.so.6`std::ostream::sentry::sentry(this=0x00007fffffffd3d0, __os=0x00007ffff7f7b480) at ostream.tcc:51:19 (lldb) step Process 160768 exited with status = 11 (0x0000000b)
补充:运行环境为Linux,使用Clang 14.0.6编译。
解决方法
方法1:改用libc++标准库
Clang 14对libstdc的C20模块支持存在兼容性问题,改用Clang原生的libc++库可解决该问题,调整编译命令如下:
# 预编译模块 clang++ -std=c++20 -stdlib=libc++ --precompile Hello.cppm -o Hello.pcm # 编译并链接 clang++ -std=c++20 -stdlib=libc++ use.cpp -fprebuilt-module-path=. Hello.pcm -o Hello.out
方法2:将模块预编译文件转为目标文件后再链接
避免直接链接.pcm文件,先将其编译为目标文件,再参与链接:
# 预编译模块 clang++ -std=c++20 --precompile Hello.cppm -o Hello.pcm # 将pcm转为目标文件 clang++ -std=c++20 -c Hello.pcm -o Hello.o # 编译主文件并链接目标文件 clang++ -std=c++20 use.cpp Hello.o -o Hello.out
方法3:升级Clang版本
Clang 14属于较早支持C20模块的版本,模块实现存在部分bug,升级到Clang 15及以上版本,配合gcc 12+版本的libstdc,也可解决该问题。
内容的提问来源于stack exchange,提问作者TheBeautifulOrc
相关产品推荐
相关产品推荐

