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_definitions
和 target_compile_options
命令来设置调试和发布模式下的编译选项。
根据错误信息,措施如下:
- 将 _ITERATOR_DEBUG_LEVEL 设置为 2(debug模式)或 0(release模式)
- 【windows】 将 RuntimeLibrary 设置为 /MDd(debug模式)或 /MD(release模式)。
- 【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. 总结
使用特定的库文件或需要更精确地控制编译过程时,
显式设置
编译选项和定义是一种好的做法。