#c #opencv #cmake
Вопрос:
Я хочу создать приложение, и я не хочу добавлять полные исходники OpenCV, поэтому я решил использовать .dll
их для своего небольшого проекта, я добавил .dll
файл s и .lib
s opencv и написал для них конфигурацию cmake:
project(OpenCV CXX)
set(OPENCV_VERSION 453)
add_library(OpenCV_Core SHARED IMPORTED GLOBAL)
set_target_properties(OpenCV_Core PROPERTIES
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/bin/opencv_core${OPENCV_VERSION}.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv_core${OPENCV_VERSION}.lib"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include"
)
add_library(OpenCV_Highgui SHARED IMPORTED GLOBAL)
set_target_properties(OpenCV_Highgui PROPERTIES
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/bin/opencv_highgui${OPENCV_VERSION}.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv_highgui${OPENCV_VERSION}.lib"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include"
)
add_library(OpenCV_Imgproc SHARED IMPORTED GLOBAL)
set_target_properties(OpenCV_Imgproc PROPERTIES
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/bin/opencv_imgproc${OPENCV_VERSION}.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv_imgproc${OPENCV_VERSION}.lib"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include"
)
add_library(OpenCV_Imgcodecs SHARED IMPORTED GLOBAL)
set_target_properties(OpenCV_Imgcodecs PROPERTIES
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/bin/opencv_imgcodecs${OPENCV_VERSION}.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv_imgcodecs${OPENCV_VERSION}.lib"
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include"
)
add_custom_target(COPY_LIBS ALL)
file(GLOB_RECURSE libs ${CMAKE_CURRENT_SOURCE_DIR}/bin/*.dll)
foreach(lib ${libs})
add_custom_command(
TARGET COPY_LIBS
COMMAND ${CMAKE_COMMAND} -E copy ${lib} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
)
endforeach()
И использовать их таким образом в моем целевом проекте
cmake_minimum_required(VERSION 3.21)
project(TestProject)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
add_subdirectory(3rdParty/opencv-4.5.3)
add_executable(TestProject main.cpp)
target_link_libraries(TestProject PUBLIC OpenCV_Core OpenCV_Highgui OpenCV_Imgproc OpenCV_Imgcodecs)
и мой главный
int main()
{
cv::Mat img;
return 0;
}
этого должно быть достаточно, чтобы проверить, правильно ли загружена хотя бы opencv_core
библиотека
Он отлично компилируется, ошибок при связывании не возникает, однако, когда я запускаю приложение, я получаю этот странный вывод
сбой запуска процесса: неизвестная ошибка
Процесс завершен с кодом выхода 0
Все файлы библиотеки и включенные файлы взяты из одного и того же официального релиза