xcode “__mh_execute_header”的符号未定义

nfeuvbwi  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(261)

我正在构建一个动态框架。我的框架与几个静态库链接。当它与示例应用程序一起在模拟器中运行时,它工作正常。但当我试图将它与示例应用程序一起存档时,我从链接器中得到以下错误。

Undefined symbols for architecture arm64:
  "__mh_execute_header", referenced from:

那么,什么是__mh_execute_header,它是在什么框架/库中定义的呢?

gzjq41n4

gzjq41n41#

这是一个链接器定义的符号。从<mach-o/ldsyms.h>的顶部开始:
这个文件描述了链接编辑器定义的符号。链接编辑器符号的语义是,只有当链接编辑器被引用时,它才由链接编辑器定义,并且用户定义它们是错误的(参见手册页ld(1))。标准的UNIX链接编辑器符号:__结束,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,那么引用可能来自你正在使用的静态库,而且只有在为arm 64构建时才是这样,这对那些库来说是一件坏事,因为这意味着它们只能在可执行文件中使用,而不能在框架中使用。
您没有包括符号引用的位置,但这可能会帮助您识别问题。如果这些静态库来自第三方,那么您将不得不去他们那里寻求帮助来解决问题。

xtfmy6hx

xtfmy6hx2#

__mh_execute_header无法在动态框架中运行

gpfsuwkq

gpfsuwkq3#

你应该改一下密码

dladdr(&_mh_execute_header, &info);

dladdr(&_MH_EXECUTE_SYM, &info);

相关问题