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

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

相关文章
|
2月前
|
测试技术 编译器 vr&ar
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(一)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
90 1
|
2月前
|
存储 Linux C++
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(二)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
49 0
|
2月前
|
API Android开发 开发者
debug常见错误,出现debug时出现跑进为条件为false的if语句,DELETE_FAILED_INTERNAL_ERROR Error while In
debug常见错误,出现debug时出现跑进为条件为false的if语句,DELETE_FAILED_INTERNAL_ERROR Error while In
20 5
|
2月前
|
Unix Linux Shell
CMake深度解析:掌握add_custom_command,精通Makefile生成规则(三)
CMake深度解析:掌握add_custom_command,精通Makefile生成规则
64 1
|
5月前
debug的含义和使用
debug的含义和使用
130 0
debug的含义和使用
|
6月前
|
编译器 Linux Windows
[√]_ITERATOR_DEBUG_LEVEL
[√]_ITERATOR_DEBUG_LEVEL
48 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”文件
115 0
C# Debug Trace调试类用法
    Debug和Trace都是调试类。     Debug类的方法只有DEBUG版中生效,而Trace的方法可以在DEBUG/RELEASE版本中生效。 一、Debug类 Debug类的控制台输出及断言Assert用法。
1692 0