您的当前位置:首页正文

记 xcode 16.1 beta 中 __mh_execute_header 编译报错

2024-10-23 来源:个人技术集锦
问题描述

朋友升级了 xcode 16.1 beta。在 iOS 项目中接入 unity 时,其中有一步需要设置 [ufw setExecuteHeader: &_mh_execute_header];

UnityFramework *UnityFrameworkLoad() {
    NSString *bundlePath = nil;
    bundlePath = [[NSBundle mainBundle] bundlePath];
    bundlePath = [bundlePath stringByAppendingString: @"/Frameworks/UnityFramework.framework"];
    
    NSBundle* bundle = [NSBundle bundleWithPath: bundlePath];
    if ([bundle isLoaded] == false) [bundle load];
    
    UnityFramework *ufw = [bundle.principalClass getInstance];
    if (![ufw appController]) {
      	// 首次初始化 Unity
        [ufw setExecuteHeader: &_mh_execute_header];
    }
    return ufw;
}

发现编译报错:

Undefined symbols for architecture arm64:

“__mh_execute_header”, referenced from:UnityFrameworkLoad() in PCAppDelegate.o

ld: symbol(s) not found for architecture arm64

clang++: error: linker command failed with exit code 1 (use -v to see invocation)

__mh_execute_header 它为程序提供了一个访问其自身 Mach-O 头部的方式。在 Unity 的集成中,这个符号可能被用来帮助 Unity 框架定位和初始化它需要的资源和代码段。

解决

尝试写个 demo 发现在 xcode 15、16 beta 上却都能编译通过。

另外也有 Apple Developer Forums 类似问题的相关讨论。

教训
显示全文