我有一个iOS项目,在我的项目中我有一个c++方法:
ClassA::getElements(vector<vector<int> >&ovElements) {
// ...
}
我用xcodebuild
命令构建了我的项目,从.o
文件中,我知道它的混乱名称是__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工具来导出所有函数/方法的边界沿着它们的名称从源文件中导出。我可以使用MatchFinder
找到所有cxxMethod
和function
并得到它们的FunctionDecl
,然后我使用下面的方法得到它们的混乱名称:
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
方法,我得到了_ZN25ClassA18getElementsERii
,这不是我想要的。在对它进行了分类之后,我发现它的名字是ClassA::getElements(int&)
。
顺便说一句,我使用的编译数据库是由xcpretty
生成的,
xcodebuild ... | xcpretty -r json-compilation-database
我的问题是为什么我得到int&
而不是std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > >&
。如何获得编译器生成的相同的损坏名称?
我遵循了@user17732522的评论,建立了一个只包含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;
}
我仍然得到了混乱的名字_ZN6ClassA3fooERi
。但我注意到clang有一个错误:
Test.hpp:11:10: fatal error: 'stdio.h' file not found
但是,我可以通过Xcode或xcodebuild命令成功构建它。
1条答案
按热度按时间lzfw57am1#
我想出来了!根本原因是在解析我的源文件时,出现致命错误“xxx.h”文件未找到。一旦我手动修复了这个错误,Clang就可以输出正确的结果了。