環境
- Xcode Version 16.0
事象
- 担当エンジニアが、XcodeをVersion 16.0へアップデートしました。
- アップデート完了後に、UaaL(Unity as a Library)アプリをビルドしたところ下記のエラーが出力されました。
Undefined symbol: __mh_execute_header Linker command failed with exit code 1 (use -v to see invocation)
解決策
- UnityFrameworkをセットアップする箇所のうち、
_mh_execute_header
を使用している箇所を、_mh_dylib_header
へ修正する。
let bundlePath: String = Bundle.main.bundlePath + "/Frameworks/UnityFramework.framework"
let bundle = Bundle(path: bundlePath)!
if !bundle.isLoaded == false {
bundle.load()
}
let frameworkClass = bundle.principalClass as! UnityFramework.Type
let framework = frameworkClass.getInstance()!
if framework.appController() == nil {
let machineHeader = UnsafeMutablePointer<MachHeader>.allocate(capacity: 1)
// 変更前
// machineHeader.pointee = _mh_execute_header
// 変更後
machineHeader.pointee = _mh_dylib_header
framework.setExecuteHeader(machineHeader)
}
- エンジニアの環境では上記で解決しましたが、内容に誤りがあったり、他に情報がございましたらコメント頂けますと幸いです。
参考元
_mh_execute_header is a synthetic symbols inserted by the linker to mark the beginning of a Mach-O executable. There are a suite of these, one for each Mach-O image type, all defined in . That header has doc comments that explain their usage.
The most common cause of problems like this is with folks using the wrong symbol. _mh_execute_header is only relevant if you’re building an executable. If, for example, you’re building a dynamic library or framework, you must use _mh_dylib_header instead.
- Apple様の回答によりますと、UaaL(Unity as a Library)含め、Frameworkをビルドする際にはシンボル
_mh_dylib_header
を使用しなければならないようです。
-
__mh_execute_header
については、上記ページで解説しています。