macOS项目转arm64架构:如何为单一架构定义符号?
可行!用架构编译宏就能解决这个问题
你的思路完全没问题,通过编译宏控制符号仅在arm64架构下生成,刚好能解决「arm64缺符号、x86_64重复定义」的矛盾。不过要注意正确的宏写法,因为Apple平台的架构宏是带双下划线的,具体实现如下:
#ifdef __arm64__ BOOL findOutYesOrNot() { return YES; } // 这里可以放所有需要仅在arm64下编译的符号 #endif
为什么这能解决问题?
- 当Xcode编译arm64架构时,
__arm64__宏会被激活,这段代码会被正常编译,为arm64版本补上缺失的符号; - 编译x86_64架构时,这段代码会被预处理器跳过,不会生成任何符号,自然就不会和Swift Package里的同名符号冲突。
额外注意事项
确保文件已加入目标:现在不需要再纠结要不要把这个.m文件加入目标——直接把它加到项目目标里就行,宏会自动控制哪些代码参与编译。如果这个文件里还有其他需要在两个架构都运行的代码,宏的方式比单独控制文件成员资格更灵活。
验证Swift Package的符号覆盖:要确认Swift Package在x86_64下确实已经提供了这些符号,而arm64下刚好缺失,这样本地代码的补充才精准。可以用
nm命令查看架构的符号表,比如:nm -arch x86_64 YourFramework.framework/YourFramework | grep findOutYesOrNot双架构测试:分别编译arm64和x86_64版本(或者直接编译Universal二进制),检查链接阶段是否再出现报错。Xcode的「Any macOS」目标默认会编译双架构,你可以通过「Product > Scheme > Edit Scheme」切换单个架构测试。
替代方案:文件级架构控制:如果你这个.m文件里全是仅arm64需要的代码,也可以直接在Xcode里设置文件的目标成员资格——选中文件后打开右侧检查器,展开「Target Membership」的架构选项,只勾选arm64。不过这种方式不如宏灵活,适合整个文件都只对应单一架构的场景。
内容的提问来源于stack exchange,提问作者Alfonso Tesauro
相关产品推荐
相关产品推荐

