【CMake报错】“检测到_ITERATOR_DEBUG_LEVEL和RuntimeLibrary不匹配” 的解决方案

请添加图片描述
博__主:米码收割机
技__能:C++/Python语言
公众号:测试开发自动化
专__注:专注主流机器人、人工智能等相关领域的开发、测试技术


【CMake报错】“检测到_ITERATOR_DEBUG_LEVEL和RuntimeLibrary不匹配” 的解决方案(详细分析)


文章目录

  • 【CMake报错】“检测到_ITERATOR_DEBUG_LEVEL和RuntimeLibrary不匹配” 的解决方案(详细分析)
  • 1. CMake构建成功运行报错
  • 2. 原因分析
  • 3. 解决措施
    • 3.1 windows 的措施:
    • 3.2 Linux上的措施
  • 4. 总结
  • 还瞅啥?快点赞呐,臭宝!


1. CMake构建成功运行报错

自己编写CMakeLists.txt构建C++代码,运行代码时时,报了如下错误:

(1)错误 LNK2038 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” (XXXX.obj 中)

(2)错误 LNK2038 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease” 不匹配值“MDd_DynamicDebug”(XXXX.obj 中)


2. 原因分析

(1)这些错误是由于项目中使用的库文件与项目的编译选项不匹配引起的。
(2)错误LNK2038表示在链接过程中发现了不匹配项。
(3)需要调整链接选项以与库文件和编译选项匹配。
(4)两个不匹配项需要处理:_ITERATOR_DEBUG_LEVEL 和 RuntimeLibrary。


3. 解决措施

CMakeLists.txt中添加 target_compile_definitionstarget_compile_options 命令来设置调试和发布模式下的编译选项。
根据错误信息,措施如下:

  1. 将 _ITERATOR_DEBUG_LEVEL 设置为 2(debug模式)或 0(release模式)
  2. 【windows】 将 RuntimeLibrary 设置为 /MDd(debug模式)或 /MD(release模式)。
  3. 【Linux】将 RuntimeLibrary 设置为 -g(debug模式)或 -O3(release模式)。

CMakeLists.txt部分修改内容如下:

前提:我的项目名称是GtestAPI, 并且Debug和release时,我分别想要调用不同的lib文件。

3.1 windows 的措施:

# 根据构建类型选择不同的库文件路径
if(CMAKE_BUILD_TYPE MATCHES Debug)
    # debug模式
    target_link_directories(GtestAPI PRIVATE ${DEBUG_LIB_DIR})
    target_link_libraries(GtestAPI PRIVATE gmock_maind gtest_maind)
    
    # 【显式设置】debug模式下的编译定义(重点是这里)
    target_compile_definitions(GtestAPI PRIVATE _ITERATOR_DEBUG_LEVEL=2)
    # 【显式设置】debug模式下的编译选项(重点是这里)
    target_compile_options(GtestAPI PRIVATE /MDd)
else()
    # release模式
    target_link_directories(GtestAPI PRIVATE ${RELEASE_LIB_DIR})
    target_link_libraries(GtestAPI PRIVATE gmock_main gtest_main)
    
    # 【显式设置】release模式下的编译定义(重点是这里)
    target_compile_definitions(GtestAPI PRIVATE _ITERATOR_DEBUG_LEVEL=0)
    # 【显式设置】release模式下的编译选项(重点是这里)
    target_compile_options(GtestAPI PRIVATE /MD)

3.2 Linux上的措施

# 根据构建类型选择不同的库文件路径
if(CMAKE_BUILD_TYPE MATCHES Debug)
    # debug模式
    target_link_directories(GtestAPI PRIVATE ${DEBUG_LIB_DIR})
    target_link_libraries(GtestAPI PRIVATE gmock_maind gtest_maind)
    
    # 【显式设置】debug模式下的编译定义(重点是这里)
    target_compile_definitions(GtestAPI PRIVATE _ITERATOR_DEBUG_LEVEL=2)
    # 【显式设置】debug模式下的编译选项(重点是这里)
    target_compile_options(GtestAPI PRIVATE -g)
else()
    # release模式
    target_link_directories(GtestAPI PRIVATE ${RELEASE_LIB_DIR})
    target_link_libraries(GtestAPI PRIVATE gmock_main gtest_main)
    
    # 【显式设置】release模式下的编译定义(重点是这里)
    target_compile_definitions(GtestAPI PRIVATE _ITERATOR_DEBUG_LEVEL=0)
    # 【显式设置】release模式下的编译选项(重点是这里)
    target_compile_options(GtestAPI PRIVATE -O3)

4. 总结

使用特定的库文件或需要更精确地控制编译过程时,显式设置 编译选项和定义是一种好的做法。


还瞅啥?快点赞呐,臭宝!

你可能感兴趣的:(c++,CMake,CMakeLists.txt,C++编译,软件构建)