我已添加AddressSanitizer标志,如下所示:
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
在使用Unix Makefiles
时,一切都构建和运行良好。
问题出现在生成Xcode项目时,它只是不想链接,因为它找不到ASan库。
我已经找到了两个解决方案,但决定不使用它们,因为它们不能仅使用CMake自动化:
1.将-Wl,-undefined,dynamic_lookup
添加到链接的标志,这样它就跳过了到动态库的链接。
1.直接与libclang_rt.asan_osx_dynamic.dylib
链接。
那么这两种解决方案的问题是什么呢?
- 使用解决方案#1时,我必须在Xcode中手动打开目标方案,并添加指向
libclang_rt.asan_osx_dynamic.dylib
的DYLD_INSERT_LIBRARIES
环境变量。 - 使用解决方案2时,ASan库的路径因计算机而异。
此外,作为另一个解决方案,我尝试从Xcode目标方案中启用地址过滤器标志,但有趣的是,它没有检测到我添加的问题,所以我没有将其列为解决方案,因为它没有通过我的测试。
任何帮助都将不胜感激。
7条答案
按热度按时间to94eoyn1#
由于得票最多的答案是错误的方式做这几天,我没有得到适当的cmake解决方案,为这阅读这一线程,我想我会提到正确的方式在写这一点的时候,使下一个读者不需要花太多的时间与此有关。
此解决方案的思想是将
-fsanitize=address
传递给编译器和链接器标志。如果您想同时为所有目标启用此功能,可以使用add_compile_options和add_link_options。如果您有多个目标,可能是很大的目标,这是有意义的。
或者,您也可以使用target_compile_options和target_link_options为特定目标设置这些参数。如果您不希望将此设置应用于所有目标,这可能更有意义。
gywdnpxw2#
你也需要为链接器提供标志。我是这样做的:
rjee0c153#
我建议你建立你自己的峨山档案。
1.多配置生成器(Xcode、Visual Studio等)不使用
CMAKE_BUILD_TYPE
,因此我首先提供了一个示例来检查这一点。CMAKE_BUILD_TYPE
的默认值是一个 * 空字符串 *。用户可以在cmake命令行将CMAKE_BUILD_TYPE
设置为任何值。因此,我们检查这两种情况,并确保我们正在处理一个已知的构建类型(如果提供)。1.您可能还需要配置
CMAKE_MODULE_LINKER_FLAGS
。pdsfdshx4#
cmake 3.13
介绍xcode架构配置
在CMake中
何时构建
falq053o5#
首先确保调试信息,例如将
CMAKE_BUILD_TYPE
设置为Debug
,传递GCC/Clang的-g
标志。然后,如果你的目标是一个可执行文件或共享库,那么你可以设置这些cmake变量:
CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS_DEBUG
CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS_DEBUG
例如,当目标是可执行文件时:
当目标是共享库时:
然而,当你的可执行文件依赖于一个静态库,并且你想使用asan来检查你的静态库时,你必须这样设置:
whlutmcx6#
我目前找到的最简单的解决方案是
我更喜欢这个选项,因为它表达了意图(运行杀毒程序),而不是修改大量的标志。
我不知道这个选项是什么时候添加的。我也找不到它的任何文档。
vnjpjtjt7#
我发现其他答案不起作用,您需要在工具链文件中设置init变量: