首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用Xcode的CMake中启用CMake的正确方法是什么

在使用Xcode的CMake中启用CMake的正确方法是什么
EN

Stack Overflow用户
提问于 2017-06-02 03:50:49
回答 6查看 61.9K关注 0票数 73

我添加了AddressSanitizer标志如下:

代码语言:javascript
运行
复制
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中手动打开目标方案,并添加指向libclang_rt.asan_osx_dynamic.dyliblibclang_rt.asan_osx_dynamic.dylib环境变量。
  • 当使用解决方案2时,ASan库的路径因计算机而异。

另外,作为另一种解决方案,我尝试从Xcode目标方案中启用Address消毒标记,但有趣的是,它没有检测到我添加的问题,所以我没有将它作为解决方案列出,因为它失败了我的测试。

任何帮助都将不胜感激。

EN

回答 6

Stack Overflow用户

发布于 2021-12-08 08:46:54

因为这些天来,最重要的答案是错误的,而且我没有得到正确的cmake解决方案来阅读这个帖子,所以我想在写这篇文章的时候我会提到正确的方法,这样下一个读者就不需要花太多时间在这个问题上了。

此解决方案的思想是将-fsanitize=address传递给编译器和链接器标志。

如果希望同时为所有目标启用此功能,则可以使用选项选项。如果您有多个,潜在的大量目标,这是有意义的。

代码语言:javascript
运行
复制
add_compile_options(-fsanitize=address)
add_link_options(-fsanitize=address)

或者,您也可以使用选项选项为特定目标设置它们。如果不希望这适用于所有目标,这可能更有意义。

代码语言:javascript
运行
复制
target_compile_options(asan-target PRIVATE -fsanitize=address)
target_link_options(asan-target PRIVATE -fsanitize=address)
票数 55
EN

Stack Overflow用户

发布于 2017-08-29 13:22:06

您也需要向链接器提供标志。我就是这样做的

代码语言:javascript
运行
复制
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
票数 38
EN

Stack Overflow用户

发布于 2020-10-10 15:01:32

我提议建立你自己的Asan档案。

代码语言:javascript
运行
复制
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)

if(isMultiConfig)
    if(NOT "Asan" IN_LIST CMAKE_CONFIGURATION_TYPES)
        list(APPEND CMAKE_CONFIGURATION_TYPES Asan)
    endif()
else()
    set(allowedBuildTypes Asan Debug Release RelWithDebInfo MinSizeRel)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${allowedBuildTypes}")

    if(CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE IN_LIST allowedBuildTypes)
        message(FATAL_ERROR "Invalid build type: ${CMAKE_BUILD_TYPE}")
    endif()
endif()

set(CMAKE_C_FLAGS_ASAN
    "${CMAKE_C_FLAGS_DEBUG} -fsanitize=address -fno-omit-frame-pointer" CACHE STRING
    "Flags used by the C compiler for Asan build type or configuration." FORCE)

set(CMAKE_CXX_FLAGS_ASAN
    "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address -fno-omit-frame-pointer" CACHE STRING
    "Flags used by the C++ compiler for Asan build type or configuration." FORCE)

set(CMAKE_EXE_LINKER_FLAGS_ASAN
    "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -fsanitize=address" CACHE STRING
    "Linker flags to be used to create executables for Asan build type." FORCE)

set(CMAKE_SHARED_LINKER_FLAGS_ASAN
    "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -fsanitize=address" CACHE STRING
    "Linker lags to be used to create shared libraries for Asan build type." FORCE)

备注:

  1. AddressSanitizer (ASan)与MSVC的结合还处于实验阶段,所以这里没有提供MSVC的方法。
  2. CMAKE_BUILD_TYPE不被多配置生成器(Xcode、Visual等)使用,因此我提供了一个示例来首先检查这一点。
  3. CMAKE_BUILD_TYPE的默认值是空字符串。用户可以在cmake命令行将CMAKE_BUILD_TYPE设置为任意值。因此,我们检查这两种情况,并确保我们处理的是已知的构建类型(如果提供的话)。
  4. 还有您可能需要配置的CMAKE_MODULE_LINKER_FLAGS

使用:

代码语言:javascript
运行
复制
$ cmake \
    -DCMAKE_BUILD_TYPE=Asan \
    ...
    ...
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44320465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档