Импортированные CMake целевые объекты в add_subdirectory недоступны в основном файле CMakeLists.txt.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Импортированные CMake целевые объекты в add_subdirectory недоступны в основном файле CMakeLists.txt.

Сообщение Anonymous »

Я хочу создать приложение, которое зависит от модуля 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»