add_subdirectory 中的 CMake 导入目标在主 CMakeLists.txt 中不可用

Ijo*_*chy 4 c++ opencv cmake

我想构建一个依赖于 OpenCV(版本 3.4.6)即模块的应用程序。该模块具有 VTK 库(版本 7.1.1)作为依赖项。我想使用ExternalProject 来构建vtk 库和opencv viz 模块,然后想要构建主应用程序,所有这些都在一次cmake 运行中完成。

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 deps\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

我使用 cmakeExternalProject 模块在子目录中构建 opencv 和 vtk,如下所示:

\n

deps/CMakeLists.txt

\n
cmake_minimum_required(VERSION 3.14)\n\nproject(dependencies)\n\ninclude(ExternalProject)\n\nExternalProject_add(\n  vtklib\n  GIT_REPOSITORY https://github.com/Kitware/vtk\n  GIT_TAG v7.1.1\n  GIT_PROGRESS TRUE\n  UPDATE_COMMAND ""\n  CMAKE_ARGS\n  -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}\n  -DBUILD_TESTING=OFF\n  -DBUILD_EXAMPLES=OFF\n  -DVTK_DATA_EXCLUDE_FROM_ALL=ON\n  -DVTK_USE_CXX11_FEATURES=ON\n  -Wno-dev\n  )\n\nadd_library(vtk INTERFACE IMPORTED GLOBAL)\nadd_dependencies(vtk vtklib)\n\nExternalProject_add(\n  ocv\n  GIT_REPOSITORY https://github.com/opencv/opencv\n  GIT_TAG 3.4.6\n  GIT_PROGRESS TRUE\n  UPDATE_COMMAND ""\n  CMAKE_ARGS\n  -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}\n  -DWITH_VTK=ON\n  -Wno-dev\n  )\n\n\n# ExternalProject_Get_Property(ocv install_dir)\n# include_directories(${install_dir}/src/ocv/include)\ninclude_directories(${CMAKE_INSTALL_PREFIX}/include)\n\nset(ocv_libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_VS_PLATFORM_NAME}/vc15)\nset(OCV_VERSION 346)\n\nadd_dependencies(ocv vtklib)\n\nadd_library(opencv_core SHARED IMPORTED)\nset_target_properties(opencv_core PROPERTIES\n  IMPORTED_IMPLIB "${ocv_libdir}/lib/opencv_core${OCV_VERSION}.lib"\n  IMPORTED_LOCATION "${ocv_libdir}/bin/opencv_core${OCV_VERSION}.dll"\n  )\n\nadd_library(opencv_viz SHARED IMPORTED)\nset_target_properties(opencv_viz PROPERTIES\n  IMPORTED_IMPLIB "${ocv_libdir}/lib/opencv_viz${OCV_VERSION}.lib"\n  IMPORTED_LOCATION "${ocv_libdir}/bin/opencv_viz${OCV_VERSION}.dll"\n  )\n
Run Code Online (Sandbox Code Playgroud)\n

主要的 CMakeLists.txt 如下所示:

\n
cmake_minimum_required(VERSION 3.14)\n\nproject(cmaketest VERSION 0.1 DESCRIPTION "" LANGUAGES CXX)\n\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(CMAKE_CXX_Flags "${CMAKE_CXX_FLAGS} -std=c++17")\n\n# include_directories(${CMAKE_INSTALL_PREFIX}/include)\nadd_subdirectory(deps)\n\n\nadd_executable(${PROJECT_NAME} main.cpp)\ntarget_link_libraries(${PROJECT_NAME} opencv_core opencv_viz)\n\ninstall(\n  TARGETS ${PROJECT_NAME}\n  EXPORT "${PROJECT_NAME}-targets"\n  LIBRARY DESTINATION lib/\n  ARCHIVE DESTINATION lib/${CMAKE_PROJECT_NAME}\n  RUNTIME DESTINATION bin\n  PUBLIC_HEADER DESTINATION include/${CMAKE_PROJECT_NAME}/${PROJECT_NAME}\n  )\n
Run Code Online (Sandbox Code Playgroud)\n

main.cpp 的完整性:

\n
#include <opencv2/viz.hpp>\n\nint main(){}\n
Run Code Online (Sandbox Code Playgroud)\n

但似乎内部的 include_directories 和 add_library 调用deps/CMakeLists.txt无法在正确的范围内工作,因为我收到以下错误消息:

\n
error C1083: File (Include) can not be opened: "opencv2/viz.hpp"\n
Run Code Online (Sandbox Code Playgroud)\n

如果我取消注释include_directories主 CMakeLists.txt 内部的注释,则会收到链接器错误(这不是我想要的,应在内部指定包含的目录deps/CMakeLists.txt):

\n
LNK1181: opencv_core.lib can not be opened\n
Run Code Online (Sandbox Code Playgroud)\n

deps/CMakeLists.txt如果我只是复制main 中的内容来CMakeLists.txt代替调用,add_subdirectory一切正常。

\n

那么,如何从主 CMakeLists 的子目录中获取包含目录和创建的目标?

\n

编辑:

\n

调用 cmake 配置:

\n
cmake.exe -B build -S . -G "Visual Studio 17 2022" -A x64 -T v141 -DCMAKE_INSTALL_PREFIX=D:/test\n
Run Code Online (Sandbox Code Playgroud)\n

调用 cmake 构建:

\n
cmake.exe --build build --config Release --target install\n
Run Code Online (Sandbox Code Playgroud)\n

Tsy*_*rev 8

与全局的普通目标不同,IMPORTED 目标默认位于创建它的目录的本地。

要扩展 IMPORTED 目标的可见性,请使用 GLOBAL 关键字:

add_library(opencv_core SHARED IMPORTED GLOBAL)
Run Code Online (Sandbox Code Playgroud)

这是在文档中写的add_library(IMPORTED)

目标名称的范围位于创建它的目录及其以下目录中,但 GLOBAL 选项扩展了可见性。