“ __mh_execute_header”的未定义符号

时间:2019-01-25 15:52:11

标签: ios xcode cocoa

我正在建立一个动态框架。我的框架与几个静态库链接。当它在带有示例应用程序的模拟器中运行时,它可以正常工作。但是,当我尝试使用示例应用程序对其进行存档时,链接器出现以下错误。

streambuilders

那么Undefined symbols for architecture arm64: "__mh_execute_header", referenced from: 是什么,它在什么框架/库中定义?

2 个答案:

答案 0 :(得分:1)

这是链接器定义的符号。从<mach-o/ldsyms.h>的顶部开始:

  

此文件描述了链接编辑器定义的符号。的语义   链接编辑器符号是仅在以下情况下由链接编辑器定义   被引用,并且用户定义它们是错误的(请参阅   手册页ld(1))。标准的UNIX链接编辑器符号:__end,   Apple Mach-O链接编辑器不支持__etext和__edata。这些符号在Mach-O对象中确实没有意义   文件和受支持的链接编辑器符号(此处描述)   更换它们。对于标准UNIX链接编辑器符号   程序可以使用符号   __mh_execute_header并遍历其程序的加载命令,以确定该程序段中任何节或段的结束(或开始)   程序。请注意,编译器在所有外部   使用高级语言编码的符号名称。因此,在“ C”中的名称是   编码时没有下划线,符号表中的符号名称带有   底线。每个链接编辑器定义的名称都有两个cpp宏   在此文件中。下划线前的宏是符号名称   而没有的是“ C”中编码的名称。

具体符号__mh_execute_header进一步标有(强调):

  

链接编辑器定义的符号[__mh_execute_header]的值是   Mach-O可执行文件类型中的mach标头的地址。 确实   不会以MH_EXECUTE文件类型以外的任何其他文件类型显示。   符号的类型是绝对的,因为标题不是任何内容的一部分   部分。

因此,链接器仅在链接可执行文件而不是库,框架或捆绑软件时定义__mh_execute_header

假定您的框架代码未引用_mh_execute_header,则该引用大概来自您正在使用的静态库。然后仅在为arm64构建时。对于那些库来说这是一件坏事,因为这意味着它们只能在可执行文件中使用,而不能在框架中使用。

您没有包括该符号的引用来源,但这大概可以帮助您识别罪魁祸首。如果这些静态库来自第三方,那么您将不得不向他们寻求帮助来解决它。

答案 1 :(得分:0)

你应该改变代码

dladdr(&_mh_execute_header, &info);

dladdr(&_MH_EXECUTE_SYM, &info);