You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:10:20