如何通过LLVM生成与编译器一致的C++方法名字?
问题:Clang工具生成的C++方法Mangled名称与Xcode编译结果不一致
原项目场景
我有一个iOS项目,包含如下C++方法:
ClassA::getElements(vector<vector<int> >& ovElements) { // ... }
通过xcodebuild命令构建项目后,从.o文件中得到该方法的Mangled名称为__ZN25ClassA18getElementsERNSt3__16vectorINS1_IiNS0_9allocatorIiEEEENS2_IS4_EEEE,对应的可读名称为ClassA::getElements(std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >&)。
Clang工具的异常表现
我正在开发一个Clang工具,通过MatchFinder查找所有cxxMethod和function并获取FunctionDecl,再通过以下代码生成Mangled名称:
std::string getMangledName(const FunctionDecl *FD, const MatchFinder::MatchResult &Result) { auto mangleContext = Result.Context->createMangleContext(); if (!mangleContext->shouldMangleDeclName(FD)) { return FD->getNameInfo().getName().getAsString(); } std::string mangledName; llvm::raw_string_ostream ostream(mangledName); mangleContext->mangleName(FD, ostream); ostream.flush(); delete mangleContext; return mangledName; }
但针对ClassA::getElements方法,工具输出的Mangled名称为_ZN25ClassA18getElementsERii,对应的可读名称是ClassA::getElements(int&),与预期完全不符。
另外,我通过以下命令使用xcpretty生成编译数据库:
xcodebuild ... | xcpretty -r json-compilation-database
最小复现案例
按照建议搭建了仅包含Test.hpp和Test.cpp的最小项目:
Test.hpp
#ifndef Test_hpp #define Test_hpp #include <stdio.h> #include <vector> class ClassA { public: void foo(std::vector<std::vector<int> >& ov); }; #endif /* Test_hpp */
Test.cpp
#include "Test.hpp" using namespace std; void ClassA::foo(vector<vector<int> >& ov) { return; }
在这个项目中,Clang工具仍输出Mangled名称_ZN6ClassA3fooERi,同时报错:
Test.hpp:11:10: fatal error: 'stdio.h' file not found
但该项目可以正常通过Xcode或xcodebuild命令构建。
核心疑问
- 为什么Clang工具会将参数类型识别为
int&,而非正确的嵌套vector引用? - 如何让Clang工具生成与Xcode编译器完全一致的Mangled名称?
内容的提问来源于stack exchange,提问作者徐赵诚
相关产品推荐
相关产品推荐

