无法将 OpenCV 中的 .dll 与 CMake 一起使用

Cannot use .dll from OpenCV with CMake

我有以下CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project( project_360_visual )
find_package( OpenCV REQUIRED )
set(SOURCE_FILES 
    ${CMAKE_SOURCE_DIR}/src/project_360_visual.cpp
    ${CMAKE_SOURCE_DIR}/src/projection.cpp)
set(INCLUDE_FILES
    ${CMAKE_SOURCE_DIR}/include/project_360_visual.h
    ${CMAKE_SOURCE_DIR}/include/projection.h)
LINK_DIRECTORIES(c:/opencv/build/bin/Release)
add_library(opencv_tracking430 SHARED IMPORTED GLOBAL)
set_target_properties(opencv_tracking430 PROPERTIES IMPORTED_LOCATION c:/opencv/build/bin/Release/opencv_tracking430.dll)
add_executable( project_360_visual ${SOURCE_FILES} ${INCLUDE_FILES})
target_include_directories(project_360_visual PUBLIC ${CMAKE_SOURCE_DIR}/include)
target_link_libraries( project_360_visual PUBLIC ${OpenCV_LIBS} opencv_tracking430)

相关的 Visual Studio 项目是使用以下方法生成的:

cmake ../ -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=c:/opencv/build

但是,无论我做什么,我都无法link/import 正确地管理 OpenCV 中的共享库。有人可以帮我解决这个问题吗?

这是我尝试构建时 Visual Studio 的当前输出:

1>------ Build started: Project: ZERO_CHECK, Configuration: Release x64 ------
1>Checking Build System
1>CMake is re-running because C:/Projects/candido/CG/build/CMakeFiles/generate.stamp is out-of-date.
1>  the file 'C:/Projects/candido/CG/CMakeLists.txt'
1>  is newer than 'C:/Projects/candido/CG/build/CMakeFiles/generate.stamp.depend'
1>  result='-1'
1>-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18362.
1>-- Configuring done
1>-- Generating done
1>-- Build files have been written to: C:/Projects/candido/CG/build
2>------ Build started: Project: project_360_visual, Configuration: Release x64 ------
2>LINK : fatal error LNK1181: cannot open input file 'opencv_tracking430-NOTFOUND.obj'
2>Done building project "project_360_visual.vcxproj" -- FAILED.
========== Build: 1 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

更新:

根据建议尝试了以下两种变体。

变体 1:以下不编译:

cmake_minimum_required(VERSION 3.12)
project( project_360_visual )
find_package( OpenCV REQUIRED )
set(SOURCE_FILES 
    ${CMAKE_SOURCE_DIR}/src/project_360_visual.cpp
    ${CMAKE_SOURCE_DIR}/src/projection.cpp)
set(INCLUDE_FILES
    ${CMAKE_SOURCE_DIR}/include/project_360_visual.h
    ${CMAKE_SOURCE_DIR}/include/projection.h)

#Linking shared libraries
add_library(opencv_tracking430 IMPORTED GLOBAL)
set_target_properties(opencv_tracking430 PROPERTIES IMPORTED_LOCATION 
    c:/opencv/build/bin/Release/opencv_tracking430.lib
)

add_executable( project_360_visual ${SOURCE_FILES} ${INCLUDE_FILES})
target_include_directories(project_360_visual PUBLIC ${CMAKE_SOURCE_DIR}/include)
target_link_libraries( project_360_visual PUBLIC ${OpenCV_LIBS} opencv_tracking430)

错误:

1>------ Build started: Project: ZERO_CHECK, Configuration: Release x64 ------
1>Checking Build System
1>CMake is re-running because C:/Projects/candido/CG/build/CMakeFiles/generate.stamp is out-of-date.
1>  the file 'C:/Projects/candido/CG/CMakeLists.txt'
1>  is newer than 'C:/Projects/candido/CG/build/CMakeFiles/generate.stamp.depend'
1>  result='-1'
1>-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18362.
1>CMake Error at CMakeLists.txt:13 (add_library):
1>  add_library called with IMPORTED argument but no library type.
1>
1>
1>CMake Error at CMakeLists.txt:14 (set_target_properties):
1>  set_target_properties Can not find target to add properties to:
1>  opencv_tracking430
1>
1>
1>-- Configuring incomplete, errors occurred!
1>See also "C:/Projects/candido/CG/build/CMakeFiles/CMakeOutput.log".
1>CMake Configure step failed.  Build files cannot be regenerated correctly.  Attempting to stop IDE build.
1>C:\Program Files (x86)\Microsoft Visual Studio17\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(209,5): error MSB6006: "cmd.exe" exited with code 1.
1>Done building project "ZERO_CHECK.vcxproj" -- FAILED.
2>------ Build started: Project: project_360_visual, Configuration: Release x64 ------
2>Building Custom Rule C:/Projects/candido/CG/CMakeLists.txt
2>CMake is re-running because C:/Projects/candido/CG/build/CMakeFiles/generate.stamp is out-of-date.
2>  the file 'C:/Projects/candido/CG/CMakeLists.txt'
2>  is newer than 'C:/Projects/candido/CG/build/CMakeFiles/generate.stamp.depend'
2>  result='-1'
2>-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18362.
2>CMake Error at CMakeLists.txt:13 (add_library):
2>  add_library called with IMPORTED argument but no library type.
2>
2>
2>CMake Error at CMakeLists.txt:14 (set_target_properties):
2>  set_target_properties Can not find target to add properties to:
2>  opencv_tracking430
2>
2>
2>-- Configuring incomplete, errors occurred!
2>See also "C:/Projects/candido/CG/build/CMakeFiles/CMakeOutput.log".
2>C:\Program Files (x86)\Microsoft Visual Studio17\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(209,5): error MSB6006: "cmd.exe" exited with code 1.
2>Done building project "project_360_visual.vcxproj" -- FAILED.
========== Build: 0 succeeded, 2 failed, 0 up-to-date, 0 skipped ==========

变体 2:

这可以编译,但是在 运行 时它抱怨找不到相关的 .dll

cmake_minimum_required(VERSION 3.12)
project( project_360_visual )
find_package( OpenCV REQUIRED )
set(SOURCE_FILES 
    ${CMAKE_SOURCE_DIR}/src/project_360_visual.cpp
    ${CMAKE_SOURCE_DIR}/src/projection.cpp)
set(INCLUDE_FILES
    ${CMAKE_SOURCE_DIR}/include/project_360_visual.h
    ${CMAKE_SOURCE_DIR}/include/projection.h)

#Linking shared libraries
add_library(opencv_tracking430 SHARED IMPORTED GLOBAL)
set_target_properties(opencv_tracking430 PROPERTIES IMPORTED_LOCATION 
    c:/opencv/build/bin/Release/opencv_tracking430.dll
)
set_target_properties(opencv_tracking430 PROPERTIES IMPORTED_IMPLIB
    c:/opencv/build/lib/Release/opencv_tracking430.lib
)

add_executable( project_360_visual ${SOURCE_FILES} ${INCLUDE_FILES})
target_include_directories(project_360_visual PUBLIC ${CMAKE_SOURCE_DIR}/include)
target_link_libraries( project_360_visual PUBLIC ${OpenCV_LIBS} opencv_tracking430)

您不link 反对 DLL 库。这些文件用于 运行-time 加载器。通常,DLL 将与 .lib 导入库配对,您 可以 将其用于 linking。针对具有配对 .lib 的 DLL 导入和 link 的 CMake 语法如下(也使用 IMPORTED_IMPLIB):

add_library(opencv_tracking430 SHARED IMPORTED GLOBAL)
set_target_properties(opencv_tracking430 PROPERTIES IMPORTED_LOCATION 
    c:/opencv/build/bin/Release/opencv_tracking430.dll
)
set_target_properties(opencv_tracking430 PROPERTIES IMPORTED_IMPLIB
    c:/opencv/build/bin/Release/opencv_tracking430.lib
)