You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake构建C++项目启用AddressSanitizer遇未定义引用错误

解决CMake中AddressSanitizer的未定义引用问题

嘿,我之前也踩过这个一模一样的坑!你遇到的undefined reference to '__asan_report_store8'这类错误,核心原因是只在编译阶段加了ASan参数,但链接阶段没同步配置——add_definitions只会把参数传递给编译器,链接器需要同样的-fsanitize=address参数才能正确链接ASan的运行时库,不然就会找不到那些__asan_*系列符号。

下面给你两种靠谱的解决方案:

方案1:全局配置(适合整个项目都用ASan的场景)

直接修改CMake的全局编译和链接flags,确保编译和链接阶段都带上ASan参数:

# 给C++编译添加ASan相关参数
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g3 -fno-omit-frame-pointer")
# 给可执行文件链接器添加ASan参数
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
# 如果项目包含动态库,也要同步设置动态库的链接flags
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")

方案2:目标级配置(更推荐,精准控制单个目标)

如果只想给特定的可执行文件或库启用ASan,用目标级的配置更灵活,不会影响项目里的其他目标:

# 先定义你的项目目标
add_executable(your_project_target src/main.cpp src/module.cpp)

# 给这个目标添加编译参数
target_compile_options(your_project_target PRIVATE 
    -fsanitize=address 
    -g3 
    -fno-omit-frame-pointer
)

# 给这个目标添加链接参数
target_link_options(your_project_target PRIVATE -fsanitize=address)

额外注意事项

  • 如果你项目里用到了静态库,要确保静态库的编译也加上了-fsanitize=address参数,不然链接时同样会出现未定义引用错误。
  • 修改CMake配置后,记得清理CMake缓存(删掉build目录或者用cmake --build . --clean-first),再重新构建,避免旧的缓存参数干扰。

按照上面的方式调整后,重新编译项目应该就能顺利链接ASan,不会再出现那些冗长的未定义引用错误了。

内容的提问来源于stack exchange,提问作者BoltzmannBrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:50:59