我有两个工作编译器,
clang
上的Mac
,它可以针对iPhone
,以及clang
上的iPhone
,它也针对iPhone
。通常两者都可以很好地工作,生成二进制文件和库。在 Mac
上生成的库可以在 iPhone
上链接。但现在我面临一个奇怪的问题:当尝试在 iPhone 上链接到在 Mac 上创建的库时,库未链接。
Undefined symbols:
"__Z7JS_Initji", referenced from:
_main in test-CgDtHX.o
这是对 JS_Init 的调用,它被定义为一个以不同方式扩展的宏。
iphone-clang
将其展开为:
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
文档,但我找不到它。主要是因为我不知道对此的好查询词。
这里有一个关于 GCC/Clang 中函数名称修饰如何(除其他外)工作的详细参考:
http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
在第 5.1.5 节类型编码中,您会看到“ji”代表“unsigned int”和“int”。
开头的_Z来自第5.1.2节(所有函数名称的前缀),“7”是名称“JS_Init”的长度。希望有帮助!
编辑:更新了建议链接的链接,因为上一个链接已消失。
在 XCode 4.6 文档集中搜索 mangle,我发现了
LINKER_DISPLAYS_MANGLED_NAMES(显示损坏的名称) 描述: 布尔值。指定链接器是否显示 C++ 符号的损坏名称。此信息有助于诊断 C++ 链接问题。 价值观: 是:链接器显示 C++ 符号的损坏名称 (ld --no-demangle)。 否:链接器不显示 C++ 符号的损坏名称。 默认值: 不
所以我无法告诉您 ji 和 Z7 的含义,但这可能会帮助您改进链接器消息。
希望有帮助