2017-06-02 44 views
10

工作我已经添加AddressSanitizer标志如下:什么是正确的方式CMake的启用AddressSanitizer在Xcode中

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") 

一切都建立并使用Unix Makefiles时运行正常。

生成Xcode项目时出现问题,它只是不想链接,因为它找不到ASan库。

我已经发现了两个解决方案,但决定不使用他们,因为他们不能只使用CMake的自动化:

  1. 添加-Wl,-undefined,dynamic_lookup到链接的标志,所以它跳过链接到动态库。
  2. 直接链接libclang_rt.asan_osx_dynamic.dylib

那么这两种解决方案有什么问题?

  • 当使用溶液#1,我在Xcode手动打开目标方案,并添加DYLD_INSERT_LIBRARIES环境变量指向libclang_rt.asan_osx_dynamic.dylib
  • 使用解决方案#2时,ASan库的路径因计算机而异。

此外,作为另一种解决方案,我试图从Xcode目标方案启用Address Sanitizer标志,但有趣的是它没有检测到我添加的问题,所以我没有列出这个解决方案,因为它没有通过我的测试。

任何帮助将不胜感激。

+2

或许检查了这一点:https://github.com/arsenm/sanitizers-cmake – xaxxon

+0

如果你知道一个Xcode项目设置,你想要什么变成,你可以通过填充'CMAKE_XCODE_ATTRIBUTE _...'变量或使用每个目标属性'XCODE_ATTRIBUTE _...'来从CMake中设置它。 –

回答

1

您还需要为链接器提供标志。我做这样的:

set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") 
set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address") 
+0

第二行对我来说看起来不对。八位应该是CMAKE_STATIC_LINKER_FLAGS_DEBUG,或CMAKE_LINKER_FLAGS_DEBUG。 – proski

+0

设置(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -sananize = address”) 在iOS上为我工作CMake构建。你应该确保使用你构建的库的正确配置(Debug/Release) –

相关问题