我想构建一个依赖于 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,如下所示:
\ndeps/CMakeLists.txt
\ncmake_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 如下所示:
\ncmake_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)\nmain.cpp 的完整性:
\n#include <opencv2/viz.hpp>\n\nint main(){}\n
Run Code Online (Sandbox Code Playgroud)\n但似乎内部的 include_directories 和 add_library 调用deps/CMakeLists.txt
无法在正确的范围内工作,因为我收到以下错误消息:
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
):
LNK1181: opencv_core.lib can not be opened\n
Run Code Online (Sandbox Code Playgroud)\ndeps/CMakeLists.txt
如果我只是复制main 中的内容来CMakeLists.txt
代替调用,add_subdirectory
一切正常。
那么,如何从主 CMakeLists 的子目录中获取包含目录和创建的目标?
\n编辑:
\n调用 cmake 配置:
\ncmake.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 构建:
\ncmake.exe --build build --config Release --target install\n
Run Code Online (Sandbox Code Playgroud)\n
与全局的普通目标不同,IMPORTED 目标默认位于创建它的目录的本地。
要扩展 IMPORTED 目标的可见性,请使用 GLOBAL 关键字:
add_library(opencv_core SHARED IMPORTED GLOBAL)
Run Code Online (Sandbox Code Playgroud)
这是在文档中写的add_library(IMPORTED)
:
目标名称的范围位于创建它的目录及其以下目录中,但 GLOBAL 选项扩展了可见性。
归档时间: |
|
查看次数: |
1460 次 |
最近记录: |