问题
I have the following 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)
The related Visual Studio project is generated using:
cmake ../ -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=c:/opencv/build
However, no matter what I do I cannot manage to link/import correctly the shared libraries in OpenCV. Could someone help me in solving this?
This is my current output from Visual Studio when I try to build:
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 ==========
Update:
Tried the two following variations based on suggestions.
Variation 1: The following does not compile:
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)
The error:
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 Studio\2017\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 Studio\2017\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 ==========
Variation 2:
This compiles, but at run-time it complains the relevant .dll
cannot be found:
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)
回答1:
You do not link against DLL libraries. These files are for the run-time loader. Typically, DLLs will be paired with a .lib
import library, which you can use for linking. The CMake syntax to import and link against a DLL with a paired .lib
is as follows (use IMPORTED_IMPLIB also):
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
)
来源:https://stackoverflow.com/questions/61192882/cannot-use-dll-from-opencv-with-cmake