x86_64 macOS下Homebrew版g++@12启用AddressSanitizer时-lasan库缺失求助
macOS Sonoma下Homebrew gcc@12使用AddressSanitizer报错
ld: library not found for -lasan 编译命令及错误输出:
$ g++-12 --std=c++20 -g -fsanitize=address ./main.cpp -o a.out ld: library not found for -lasan collect2: error: ld returned 1 exit status
环境信息
- macOS Sonoma 14.3.1
- CPU:x86_64
- g++-12 (Homebrew GCC 12.3.0) 12.3.0
- Homebrew 4.2.7
- 命令行工具SDK路径:/Library/Developer/CommandLineTools/SDKs/MacOSX14.2.sdk
已尝试操作
- 重新安装gcc@12,问题未解决;
- 查找系统中asan相关文件,未找到gcc@12对应的
libasan.dylib,find命令输出如下:
$ find /usr/local -name "*asan*" /usr/local/Cellar/llvm/17.0.6_1/lib/clang/17/include/sanitizer/asan_interface.h /usr/local/Cellar/llvm/17.0.6_1/lib/clang/17/include/sanitizer/hwasan_interface.h /usr/local/Cellar/llvm/17.0.6_1/lib/clang/17/lib/darwin/libclang_rt.asan_abi_osx.a /usr/local/Cellar/llvm/17.0.6_1/lib/clang/17/lib/darwin/libclang_rt.asan_osx_dynamic.dylib /usr/local/Cellar/llvm/17.0.6_1/lib/clang/17/share/asan_ignorelist.txt /usr/local/Cellar/gcc/13.2.0/lib/gcc/current/gcc/x86_64-apple-darwin23/13/plugin/include/asan.h /usr/local/Cellar/gcc@12/12.3.0/lib/gcc/12/gcc/x86_64-apple-darwin23/12/plugin/include/asan.h /usr/local/Cellar/gcc@9/9.5.0/lib/gcc/9/libasan_preinit.o /usr/local/Cellar/gcc@9/9.5.0/lib/gcc/9/gcc/x86_64-apple-darwin21/9.5.0/include/sanitizer/asan_interface.h /usr/local/Cellar/gcc@9/9.5.0/lib/gcc/9/gcc/x86_64-apple-darwin21/9.5.0/plugin/include/asan.h /usr/local/Cellar/gcc@9/9.5.0/lib/gcc/9/libasan.dylib /usr/local/Cellar/gcc@9/9.5.0/lib/gcc/9/libasan.5.dylib
$ find /Library/Developer/CommandLineTools -name "*asan*" /Library/Developer/CommandLineTools/usr/lib/clang/13.1.6/include/sanitizer/asan_interface.h ... /Library/Developer/CommandLineTools/usr/lib/clang/15.0.0/lib/darwin/libasan.dylib /Library/Developer/CommandLineTools/usr/lib/clang/15.0.0/lib/darwin/libclang_rt.asan_osx_dynamic.dylib /Library/Developer/CommandLineTools/usr/lib/clang/15.0.0/lib/darwin/libclang_rt.asan_ios_dynamic.dylib /Library/Developer/CommandLineTools/usr/lib/clang/15.0.0/lib/darwin/libclang_rt.asan_watchossim_dynamic.dylib /Library/Developer/CommandLineTools/usr/lib/clang/15.0.0/lib/darwin/libclang_rt.asan_tvossim_dynamic.dylib /Library/Developer/CommandLineTools/usr/lib/clang/15.0.0/share/asan_ignorelist.txt /Library/Developer/CommandLineTools/SDKs/MacOSX14.2.sdk/usr/lib/libSystem_asan.tbd /Library/Developer/CommandLineTools/SDKs/MacOSX14.2.sdk/usr/lib/libSystem.B_asan.tbd
解决办法建议
1. 改用Clang/LLVM的AddressSanitizer
系统自带的Clang或Homebrew安装的LLVM已完整支持ASAN,直接替换编译命令即可:
# 使用系统自带Clang $ clang++ --std=c++20 -g -fsanitize=address ./main.cpp -o a.out # 使用Homebrew安装的LLVM版本 $ /usr/local/opt/llvm/bin/clang++ --std=c++20 -g -fsanitize=address ./main.cpp -o a.out
此方式无需额外配置,可直接正常使用ASAN功能。
2. 手动编译带libsanitizer支持的gcc@12
Homebrew默认gcc@12配方未开启--enable-libsanitizer,可手动编译:
- 卸载现有gcc@12:
brew uninstall gcc@12 - 编辑Homebrew的gcc@12配方:
brew edit gcc@12 - 在配方的
args参数列表中添加--enable-libsanitizer - 重新编译安装:
brew install gcc@12 --build-from-source
注意:手动编译GCC耗时较长,需确保系统已安装完整编译依赖(如Xcode Command Line Tools、make等)。
3. 降级到gcc@9使用ASAN
从find结果可知gcc@9自带libasan.dylib,若必须使用GCC的ASAN,可降级到gcc@9:
$ brew install gcc@9 $ g++-9 --std=c++20 -g -fsanitize=address ./main.cpp -o a.out
此方式无需额外编译,但gcc@9对C++20的支持不如gcc@12完善。
内容的提问来源于stack exchange,提问作者nemupm
相关产品推荐
相关产品推荐

