XCode 12无法链接Address Sanitizer报Undefined symbol解决方案
报错核心原因
___asan_version_mismatch_check_apple_clang_1200 未定义是ASAN的版本校验机制触发的错误:ASAN要求所有参与编译的源文件、链接阶段加载的ASAN运行时、预编译依赖的编译Clang版本必须完全一致,和链接阶段是否带-fsanitize=address参数没有直接关系。
排查解决步骤
- 移除手动添加的ASAN相关配置
勾选Scheme里的Address Sanitizer选项后,Xcode会自动为匹配的构建配置添加编译、链接阶段所需的全部ASAN参数,不需要手动在Other Linking Options、Other C++ Flags里额外加-fsanitize=address。手动重复添加会触发参数优先级冲突,导致链接时拉取到不匹配版本的ASAN运行时。先把所有编译、链接配置里手动加的-fsanitize=address相关参数全部删除,按下Shift+Command+K清空构建缓存后重新构建验证。 - 确认编译阶段正确注入ASAN参数
打开构建日志,任意选取一个项目内C++源文件的编译命令,检查参数中是否包含-fsanitize=address:如果编译命令中缺失该参数,说明Xcode版本存在Scheme配置同步问题,直接到Build Settings中搜索
Enable Address Sanitizer,将对应配置的值改为Yes,不要仅依赖Scheme勾选触发ASAN。 - 校验预编译依赖的编译配置
如果项目链接了预编译的.a静态库、静态Framework,需要确认所有依赖:- 要么是未开启ASAN编译的版本
- 要么是用当前Xcode内置的Apple Clang 12.0版本开启ASAN编译的版本
只要存在一个预编译依赖是用其他版本Clang(其他版本Xcode的Apple Clang、自行安装的LLVM Clang/GCC)开启ASAN编译的,链接时就会触发对应版本的校验符号缺失错误。这类场景下只需要把对应依赖用当前Xcode工具链重新编译为无ASAN的版本即可,ASAN仅需对业务源码开启,就能完成内存问题检测。
- 检查工具链版本一致性
打开Xcode设置的Locations页,确认Command Line Tools选中的是当前正在使用的Xcode版本,避免编译阶段用Xcode内置Clang、链接阶段加载到其他版本命令行工具附带的ASAN运行时,触发版本不匹配。
如果项目自定义了C/C++编译器,需要切回Xcode默认的Apple Clang,第三方Clang/GCC附带的ASAN运行时不包含Apple Clang专属的版本校验符号,必然报该错误。
内容的提问来源于stack exchange,提问作者Arial Pilisov
相关产品推荐
相关产品推荐

