Mac系统下VSCode运行C++报错显示名字修饰符号如何调整设置
Mac VSCode C++ 编译报错名字修饰符号修复方案
问题说明
你看到的__ZN6ParentD2Ev类符号是C++的*名字修饰(Name Mangling)*产物,是编译器为支持重载、类成员特性生成的统一编码,链接阶段默认不会自动解码,因此会显示无意义的编码串。
修复配置方案
方案1:修改项目编译任务配置(推荐,仅作用于当前项目)
打开项目下.vscode/tasks.json文件,找到你使用的C++编译任务,做以下任意一种修改即可:
- 方式A:给编译器加链接参数
在任务的args数组最后新增一行参数:"-Wl,-demangle",让链接器输出时自动解码符号,修改后的args示例:
"args": [ "-fcolor-diagnostics", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", // 新增参数 "-Wl,-demangle" ]
- 方式B:输出管道接cfilt解码(兼容性更好)
如果方式A不生效,把编译任务改成通过shell调用,输出经过cfilt工具(Mac系统自带)解码:
{ "label": "C/C++: clang++ 生成活动文件", "command": "sh", "args": [ "-c", "clang++ -g ${file} -o ${fileDirname}/${fileBasenameNoExtension} 2>&1 | c++filt" ], // 其余配置保持不变 }
方案2:全局终端自动解码
如果需要所有C++编译输出都自动解码,打开Mac用户目录下的~/.zshrc文件,新增两行别名配置:
alias g++='g++ 2>&1 | c++filt' alias clang++='clang++ 2>&1 | c++filt'
执行source ~/.zshrc或者重启VSCode终端后生效。
你当前代码的原生报错修复
配置完成后,你会看到原始报错本质是Parent类的虚析构函数仅声明未定义,直接修改声明为默认实现即可编译通过:
virtual ~Parent() = default;
内容的提问来源于stack exchange,提问作者Ian Chan
相关产品推荐
相关产品推荐

