我正在建立一个动态框架。我的框架与几个静态库链接。当它在带有示例应用程序的模拟器中运行时,它可以正常工作。但是,当我尝试使用示例应用程序对其进行存档时,链接器出现以下错误。
streambuilders
那么Undefined symbols for architecture arm64:
"__mh_execute_header", referenced from:
是什么,它在什么框架/库中定义?
答案 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);