我正在建立一个动态框架。我的框架与几个静态库链接。当它在带有示例应用程序的模拟器中运行时,可以正常工作。但是,当我尝试使用示例应用程序对其进行存档时,链接器出现以下错误。
Undefined symbols for architecture arm64:
"__mh_execute_header", referenced from:
那么
__mh_execute_header
是什么,它的定义框架/库是什么? 最佳答案
这是链接器定义的符号。从<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构建时。对于那些库来说这是一件坏事,因为这意味着它们只能在可执行文件中使用,而不能在框架中使用。
您没有包括该符号的引用来源,但是大概可以帮助您识别罪魁祸首。如果这些静态库来自第三方,那么您将不得不向他们寻求帮助来解决它。