2

我有两个工作编译器,clang在一个Mac可以定位的编译器iPhoneclang一个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文档,但我找不到它。主要是因为我不知道这方面的好查询词。

4

2 回答 2

1

不确定这是否会有所帮助。

在 XCode 4.6 文档集中搜索 mangle,我发现

LINKER_DISPLAYS_MANGLED_NAMES(显示错位名称) 描述:布尔值。指定链接器是否显示 C++ 符号的错位名称。此信息有助于诊断 C++ 链接问题。值: YES:链接器显示 C++ 符号的错位名称 (ld --no-demangle)。NO:链接器不显示 C++ 符号的错位名称。默认值:否

所以我不能告诉你 ji 和 Z7 是什么意思,但这可能会帮助你改进你的链接器消息。

希望有帮助

于 2013-05-15T13:55:10.870 回答
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”的长度。

希望有帮助!

于 2013-12-30T13:46:25.843 回答