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

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

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. 总结

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

相关文章
|
6月前
|
测试技术 编译器 vr&ar
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(一)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
565 1
|
2月前
|
算法 计算机视觉
Mat未初始化引起拼接算法结果,release版本和debug版本不一致
在OpenCV中由于Mat对象未初始化导致的拼接算法在release版本和debug版本中结果不一致的问题,并提供了通过显式初始化Mat对象为零来解决这一问题的修改方法。
|
6月前
|
存储 Linux C++
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(二)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
316 0
|
6月前
|
API Android开发 开发者
debug常见错误,出现debug时出现跑进为条件为false的if语句,DELETE_FAILED_INTERNAL_ERROR Error while In
debug常见错误,出现debug时出现跑进为条件为false的if语句,DELETE_FAILED_INTERNAL_ERROR Error while In
40 5
|
6月前
|
算法 编译器 程序员
深入理解C++编译模式:了解Debug和Release的区别
深入理解C++编译模式:了解Debug和Release的区别
1074 3
|
6月前
|
Unix Linux Shell
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(三)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
1506 1
|
11月前
debug的含义和使用
debug的含义和使用
464 0
debug的含义和使用
|
编译器 Linux Windows
[√]_ITERATOR_DEBUG_LEVEL
[√]_ITERATOR_DEBUG_LEVEL
109 0
关于 CMake编译出出现错误“Could not find compiler set in environment variable RC:” 的解决方法
关于 CMake编译出出现错误“Could not find compiler set in environment variable RC:” 的解决方法
关于 CMake编译出出现错误“Could not find compiler set in environment variable RC:” 的解决方法
|
C++
编译OpenJDK12:methodMatcher.cpp error C2220 警告被视为错误 - 没有生成“object”文件
编译OpenJDK12:methodMatcher.cpp error C2220 警告被视为错误 - 没有生成“object”文件
402 0