我添加了 AddressSanitizer 标志如下:
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
使用 Unix Makefiles
时,一切都可以正常构建和运行。
问题出现在生成 Xcode 项目时,它只是不想链接,因为它找不到 ASan 库。
我已经找到了两个解决方案,但决定不使用它们,因为它们不能仅使用 CMake 实现自动化:
- 将
-Wl,-undefined,dynamic_lookup
添加到链接标志中,因此它跳过链接到动态库。 - 直接链接
libclang_rt.asan_osx_dynamic.dylib
。
那么这两种解决方案有什么问题呢?
- 使用解决方案 #1 时,我必须在 Xcode 中手动打开目标方案并添加
DYLD_INSERT_LIBRARIES
环境变量指向libclang_rt.asan_osx_dynamic.dylib
。 - 使用解决方案 #2 时,ASan 库的路径因计算机而异。
此外,作为另一种解决方案,我尝试从 Xcode 目标方案中启用 Address Sanitizer 标志,但有趣的是它没有检测到我添加的问题,因此我没有将其列为解决方案,因为它未能通过我的测试。
任何帮助都感激不尽。
原文由 ObjSal 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于这些天投票最多的答案是错误的方法,而且我没有得到正确的 cmake 解决方案来阅读这个线程,我想我会在写这篇文章时提到正确的方法,以便下一位读者这样做不需要花太多时间。
此解决方案的想法是将
-fsanitize=address
传递给编译器和链接器标志。如果您想同时为所有目标启用此功能,可以使用 add_compile_options 和 add_link_options 。如果您有多个,可能是大量的目标,这是有道理的。
或者,您也可以使用 target_compile_options 和 target_link_options 为特定目标设置这些。如果您不希望这适用于所有目标,这可能更有意义。