博__主:米码收割机
技__能:C++/Python语言
公众号:测试开发自动化
专__注:专注主流机器人、人工智能等相关领域的开发、测试技术
自己编写CMakeLists.txt构建C++代码,运行代码时时,报了如下错误:
(1)错误 LNK2038 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2” (XXXX.obj 中)
(2)错误 LNK2038 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease” 不匹配值“MDd_DynamicDebug”(XXXX.obj 中)
(1)这些错误是由于项目中使用的库文件与项目的编译选项不匹配引起的。
(2)错误LNK2038表示在链接过程中发现了不匹配项。
(3)需要调整链接选项以与库文件和编译选项匹配。
(4)两个不匹配项需要处理:_ITERATOR_DEBUG_LEVEL 和 RuntimeLibrary。
在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文件。
# 根据构建类型选择不同的库文件路径
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)
# 根据构建类型选择不同的库文件路径
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)
使用特定的库文件或需要更精确地控制编译过程时,
显式设置
编译选项和定义是一种好的做法。