macOS下CLion执行Valgrind提示Library not loaded: /usr/lib/libc++.1.dylib
问题现象
报错信息
在CLion中执行Valgrind内存检测时出现如下报错:
/usr/local/bin/valgrind --tool=memcheck --xml=yes --xml-file=/private/var/folders/gq/r_j6y6112zlccqkwxp0rj_v00000gn/T/clion-valgrind6333974d-afb4-4c0b-8c03-407df60789cf/valgrind_output_%p --gen-suppressions=all --leak-check=full --leak-resolution=med --track-origins=yes --vgdb=no /Users/hayashi-ay/Projects/tests/cmake-build-debug/main --gtest_filter=* --gtest_color=no Testing started at 2:10 ... dyld[8729]: Library not loaded: /usr/lib/libc++.1.dylib Referenced from: /Users/hayashi-ay/Projects/tests/cmake-build-debug Reason: tried: '/usr/lib/libc++.1.dylib' (no such file), '/usr/local/lib/libc++.1.dylib' (no such file)
依赖验证
查询main程序的动态库依赖如下,确认存在/usr/lib/libc++.1.dylib依赖项,且直接运行./main可以正常启动:
otool -L main main: /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1200.3.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.0.0)
运行环境
- 操作系统:macOS 12.0.1
sw_vers ProductName: macOS ProductVersion: 12.0.1 BuildVersion: 21A559 - Valgrind版本:3.18.0.GIT-lbmacos
valgrind --version valgrind-3.18.0.GIT-lbmacos - CLion版本:2021.2.2
CLion 2021.2.2 Build #CL-212.5284.51, built on September 17, 2021 Licensed to xxxxxxxxxxxxxx Subscription is active until October 6, 2022 For educational use only. Runtime version: 11.0.12+7-b1504.28 x86_64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. macOS 12.0.1 GC: G1 Young Generation, G1 Old Generation Memory: 2000M Cores: 8 Registry: run.processes.with.pty=TRUE Non-Bundled Plugins: com.intellij.plugins.vscodekeymap (212.3116.29)
根因说明
从macOS 11 Big Sur版本开始,苹果将系统内置的标准动态库全部移入了内核动态缓存,磁盘上不再保留/usr/lib/libc++.1.dylib这类实体文件。程序直接运行时系统会自动从缓存中加载对应的库,所以直接启动main程序没有问题。你所使用的Valgrind 3.18开发版本未适配macOS 12的新动态库机制,扫描依赖时只会去磁盘路径查找库文件,找不到就会抛出加载失败的报错。
解决方案
- 修改程序的动态库链接路径
执行以下命令将main程序的libc++依赖指向Xcode SDK中的库文件:
修改完成后即可正常使用Valgrind检测。sudo install_name_tool -change /usr/lib/libc++.1.dylib $(xcrun --show-sdk-path)/usr/lib/libc++.1.dylib ./cmake-build-debug/main - 使用AddressSanitizer替代Valgrind
这是macOS上更推荐的内存问题检测方案,CLion原生支持。只需要在CMake配置中添加编译选项:
重新编译后直接运行程序,就会自动检测内存泄漏、越界访问等问题,检测速度和兼容性都远优于macOS版本的Valgrind。set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -g") - 静态链接libc++
编译时添加静态链接选项,避免依赖系统的动态libc++:
编译生成的可执行文件就可以直接被Valgrind加载。set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libc++")
内容的提问来源于stack exchange,提问作者hayashi-ay
相关产品推荐
相关产品推荐

