我有两个工作编译器,clang
位于Mac
,可以定位iPhone
,clang
位于iPhone
,iPhone
也定位Mac
}。通常两者都很好用,生成二进制文件和库。 iPhone
上生成的图书馆可以Undefined symbols:
"__Z7JS_Initji", referenced from:
_main in test-CgDtHX.o
上链接。但现在我遇到了一个奇怪的问题,一些库没有链接,同时试图在iphone上链接到Mac上创建的库
iphone-clang
这是对JS_Init的调用,它被定义为以不同方式扩展的宏。
extern JSRuntime * JS_Init(uint32_t maxbytes, int);
会将其展开为:
mac-clang
extern JSRuntime * JS_Init(uint32_t maxbytes, JSUseHelperThreads useHelperThreads);
将扩展为:
ji
我不确定宏扩展是否是导致连接失败的原因。
好的,现在我的问题是Z7
中__Z7JS_Initji
和argument types
究竟是什么意思?我在哪里可以找到能够显示mangling ids
与ld
之间的对应关系的表格?这必须是{{1}}个文档,但我无法找到它。主要是因为我不知道这个好的查询词。
答案 0 :(得分:1)
不确定这是否有帮助。
在XCode 4.6 docset中搜索mangle,我找到了
LINKER_DISPLAYS_MANGLED_NAMES(显示受限名称) 描述: 布尔值。指定链接器是否显示C ++符号的受损名称。此信息可以帮助诊断C ++链接问题。 价值观: 是:链接器显示C ++符号的损坏名称(ld --no-demangle)。 NO:链接器不显示C ++符号的错位名称。 默认值: NO
所以我不能告诉你ji和Z7是什么意思,但这可能会帮助你改进你的链接器消息。
希望有所帮助
答案 1 :(得分:1)
以下是关于GCC / Clang中函数名称修改如何(以及其他事项)的长篇参考:
http://mentorembedded.github.io/cxx-abi/abi.html#mangling
在5.1.5类型编码中,你会看到“ji”代表“unsigned int”和“int”。
开头的<_> _Z来自5.1.2节(所有函数名称的前缀),“7”是名称“JS_Init”的长度。希望有所帮助!