Я хочу создать приложение, которое зависит от модуля OpenCV (версия 3.4.6), а именно. Этот модуль имеет зависимость от библиотеки VTK (версия 7.1.1). Я хочу использовать ExternalProject для сборки библиотеки vtk и модуля opencv viz, а затем хочу построить основное приложение за один запуск cmake.
.
├── CMakeLists.txt
├── deps
│ └── CMakeLists.txt
└── main.cpp
Я использую модуль cmake ExternalProject для сборки opencv и vtk внутри такого подкаталога:
deps/CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(dependencies)
include(ExternalProject)
ExternalProject_add(
vtklib
GIT_REPOSITORY https://github.com/Kitware/vtk
GIT_TAG v7.1.1
GIT_PROGRESS TRUE
UPDATE_COMMAND ""
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-DBUILD_TESTING=OFF
-DBUILD_EXAMPLES=OFF
-DVTK_DATA_EXCLUDE_FROM_ALL=ON
-DVTK_USE_CXX11_FEATURES=ON
-Wno-dev
)
add_library(vtk INTERFACE IMPORTED GLOBAL)
add_dependencies(vtk vtklib)
ExternalProject_add(
ocv
GIT_REPOSITORY https://github.com/opencv/opencv
GIT_TAG 3.4.6
GIT_PROGRESS TRUE
UPDATE_COMMAND ""
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-DWITH_VTK=ON
-Wno-dev
)
# ExternalProject_Get_Property(ocv install_dir)
# include_directories(${install_dir}/src/ocv/include)
include_directories(${CMAKE_INSTALL_PREFIX}/include)
set(ocv_libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_VS_PLATFORM_NAME}/vc15)
set(OCV_VERSION 346)
add_dependencies(ocv vtklib)
add_library(opencv_core SHARED IMPORTED)
set_target_properties(opencv_core PROPERTIES
IMPORTED_IMPLIB "${ocv_libdir}/lib/opencv_core${OCV_VERSION}.lib"
IMPORTED_LOCATION "${ocv_libdir}/bin/opencv_core${OCV_VERSION}.dll"
)
add_library(opencv_viz SHARED IMPORTED)
set_target_properties(opencv_viz PROPERTIES
IMPORTED_IMPLIB "${ocv_libdir}/lib/opencv_viz${OCV_VERSION}.lib"
IMPORTED_LOCATION "${ocv_libdir}/bin/opencv_viz${OCV_VERSION}.dll"
)
Основной файл CMakeLists.txt выглядит следующим образом:
cmake_minimum_required(VERSION 3.14)
project(cmaketest VERSION 0.1 DESCRIPTION "" LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_Flags "${CMAKE_CXX_FLAGS} -std=c++17")
# include_directories(${CMAKE_INSTALL_PREFIX}/include)
add_subdirectory(deps)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} opencv_core opencv_viz)
install(
TARGETS ${PROJECT_NAME}
EXPORT "${PROJECT_NAME}-targets"
LIBRARY DESTINATION lib/
ARCHIVE DESTINATION lib/${CMAKE_PROJECT_NAME}
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include/${CMAKE_PROJECT_NAME}/${PROJECT_NAME}
)
main.cpp для полноты:
#include
int main(){}
но кажется, что вызовы include_directories и add_library внутри deps/CMakeLists.txt не работают в правильной области, поскольку я получаю следующие сообщения об ошибках:
error C1083: File (Include) can not be opened: "opencv2/viz.hpp"
если я раскомментирую include_directories внутри основного CMakeLists.txt, то получу ошибку компоновщика (это не то, что я хочу, включенные каталоги должны быть указаны внутри deps/CMakeLists.txt):
LNK1181: opencv_core.lib can not be opened
Если я просто скопирую содержимое deps/CMakeLists.txt в основной CMakeLists.txt вместо вызова add_subdirectory, все работает нормально.
Итак, как мне получить каталоги включения и созданные цели из подкаталога в моем основном CMakeLists?
редактировать:
/>вызов cmake configure:
cmake.exe -B build -S . -G "Visual Studio 17 2022" -A x64 -T v141 -DCMAKE_INSTALL_PREFIX=D:/test
вызов сборки cmake:
cmake.exe --build build --config Release --target install
Подробнее здесь: https://stackoverflow.com/questions/729 ... elists-txt