如何在CMake+Visual Studio中正确链接OpenCV的Release与Debug库
- 项目采用CMake + Visual Studio 17 2022多配置生成器构建,已内置OpenCV的
.lib和.dll文件,无需自行编译安装OpenCV - 顶层CMakeLists.txt中已设置
CMAKE_CONFIGURATION_TYPES = "Release;Debug",未使用CMAKE_BUILD_TYPE变量 - 配置命令:
cmake.exe -S . -B build -A x64 - Release模式构建正常,执行命令:
cmake.exe --build build --config Release --target install - Debug模式构建时触发链接错误:
main.obj : error LNK2019: unresolved external symbol "void __cdecl cv::imshow(class std::basic_string<char,struct std::char_traits
,class std::allocator > const &,class cv::debug_build_guard::_InputArray const &)" (?imshow@cv@@YAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_InputArray@debug_build_guard@1@@Z) referenced in function main
[D:\Projekte\OpenCVLinkerTest\build\apps\app1\app1.vcxproj]
D:\Projekte\OpenCVLinkerTest\build\apps\app1\bin\Debug\app1.exe : fatal error LNK1120: 1 unresolved externals [D:\Projekte\OpenCVLinkerTest\build\apps\app1\app1.vcxproj]
推测为Debug构建误链接OpenCV Release库导致,已将OpenCV Debug、Release库分别放置在lib/opencv/debug和lib/opencv/release目录,两个目录均包含OpenCVConfig.cmake文件,但当前CMakeLists.txt的find_package配置仅能识别Release版本的配置文件,需解决不同构建配置下自动匹配对应OpenCV库的问题。
针对Visual Studio这类多配置生成器,可通过以下几种方式实现不同配置下的OpenCV库自动匹配:
方法1:配置特定前缀路径
利用CMake的配置特定变量,为Debug和Release分别指定OpenCV的前缀路径,让find_package自动匹配:
# 为Debug配置设置OpenCV前缀路径 set(CMAKE_PREFIX_PATH_DEBUG "${CMAKE_SOURCE_DIR}/lib/opencv/debug") # 为Release配置设置OpenCV前缀路径 set(CMAKE_PREFIX_PATH_RELEASE "${CMAKE_SOURCE_DIR}/lib/opencv/release") # 自动加载对应配置的OpenCV find_package(OpenCV REQUIRED CONFIG) # 链接OpenCV库到目标 target_link_libraries(your_target_name PRIVATE ${OpenCV_LIBS})
方法2:手动指定配置文件路径并分配置链接
如果方法1不生效,可手动查找两个版本的OpenCV库,再通过配置表达式为目标链接对应版本:
# 查找Debug版本OpenCV find_package(OpenCV REQUIRED CONFIG PATHS "${CMAKE_SOURCE_DIR}/lib/opencv/debug" NO_DEFAULT_PATH) set(OpenCV_LIBS_DEBUG ${OpenCV_LIBS}) # 查找Release版本OpenCV find_package(OpenCV REQUIRED CONFIG PATHS "${CMAKE_SOURCE_DIR}/lib/opencv/release" NO_DEFAULT_PATH) set(OpenCV_LIBS_RELEASE ${OpenCV_LIBS}) # 根据当前构建配置链接对应库 target_link_libraries(your_target_name PRIVATE $<$<CONFIG:Debug>:${OpenCV_LIBS_DEBUG}> $<$<CONFIG:Release>:${OpenCV_LIBS_RELEASE}> )
方法3:利用OpenCV官方多配置支持
若使用的是官方分发的OpenCV包,通常自带多配置支持,只需指定OpenCV根目录即可:
# 设置OpenCV根目录(包含debug和release子目录的上级目录) set(OpenCV_DIR "${CMAKE_SOURCE_DIR}/lib/opencv") find_package(OpenCV REQUIRED CONFIG) target_link_libraries(your_target_name PRIVATE ${OpenCV_LIBS})
内容的提问来源于stack exchange,提问作者IjonTichy

