【问题标题】:cmake c++ library with opencv addexternalcmake c++ 库与 opencv addexternal
【发布时间】:2020-10-17 22:27:28
【问题描述】:

我想使用 cmake 构建一个 C++ 库。 该库需要on-the-fly opencv 下载和构建,然后该库将在其他 cmake 项目中用作库。

项目结构是这样的:

template_matching_project
    |
    |-- build
    |-- template_matching_project
    |              |
    |              |-- template_matching_library
    |                              |
    |                              | -- src
    |                              | -- include
    |                              | -- CMakeLists.txt
    |-- main.cpp
    |-- CMakeLists.txt

template_matching_library 使用opencv 进行一些图像处理,其cmake 文件的内容在template_matching_project/template_matching_library/CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 11)
project(template_matching)

# third party
include(ExternalProject)
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/3rdparty)
set(EXTERNAL_DOWNLOAD_LOCATION ${CMAKE_BINARY_DIR}/Download)

# OpenCV
ExternalProject_Add(opencv-contrib
  GIT_REPOSITORY https://github.com/opencv/opencv_contrib.git
  GIT_TAG e6f32c6
  SOURCE_DIR "${EXTERNAL_DOWNLOAD_LOCATION}/opencv-contrib"
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ""
)

ExternalProject_Add(opencv
  GIT_REPOSITORY https://github.com/opencv/opencv.git
  GIT_TAG 01b2c5a
  SOURCE_DIR "${EXTERNAL_DOWNLOAD_LOCATION}/opencv"
  CMAKE_ARGS
    -DBUILD_DOCS:BOOL=OFF
     ...
)
add_dependencies(opencv opencv-contrib)

# set source directories
set(PROJECT_SOURCE_DIR source)
set(INCLUDE_DIR include)

# set source files
file(GLOB_RECURSE SRCS ${PROJECT_SOURCE_DIR}/*)
file(GLOB_RECURSE HEADERS ${INCLUDE_DIR}/*)

# build library
link_directories(${EXTERNAL_INSTALL_LOCATION}/opencv/lib)

include_directories(${EXTERNAL_INSTALL_LOCATION}/opencv/include/opencv4)
include_directories(${INCLUDE_DIR})

add_library(${PROJECT_NAME} SHARED ${SRCS} ${HEADERS})
add_dependencies(${PROJECT_NAME} opencv)

target_link_libraries(${PROJECT_NAME} opencv_core opencv_highgui opencv_imgproc)

target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIR})

template_matching_library 已使用此 cmake 正确构建,但 main.cpp 可执行文件的构建失败

这里是template_matching_project/CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

set(CMAKE_CXX_STANDARD 11)

project(markers)

# include library
add_subdirectory(template_matching_library)
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/3rdparty)
include_directories(${EXTERNAL_INSTALL_LOCATION}/opencv/include/opencv4)

# add file to compile
set(SRCS main.cpp)

# add executable
add_executable(${PROJECT_NAME} ${SRCS})

# add dependencies
target_link_libraries(${PROJECT_NAME} template_matching)

然后尝试使用传统的构建

cd build
cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
make

我有以下错误

[ 95%] Building CXX object CMakeFiles/markers.dir/main.cpp.o
[100%] Linking CXX executable markers
/usr/bin/ld: cannot find -lopencv_core
/usr/bin/ld: cannot find -lopencv_highgui
/usr/bin/ld: cannot find -lopencv_imgproc
collect2: error: ld returned 1 exit status

有什么建议可以解决我的问题吗?我应该更改其中一个/两个 CMakeLists.txt。

谢谢。

【问题讨论】:

  • 欢迎来到 Stack Overflow!您的目标markers 不知道在哪里 可以找到这些 OpenCV 库。您使用link_directories 告诉template_matching 目标在哪里可以找到它们,而不是markers。您也可以尝试将此调用添加到template_matching_project/CMakeLists.txt 文件中。请注意,使用link_directories()不鼓励...
  • 感谢您的回答,确实应该避免使用link_directories。我设法使用此解决方案,以防它可能对其他人有用或可能出现其他建议

标签: opencv cmake linker


【解决方案1】:

如果有人有任何建议或更好的解决方案,我已经使用这两个 CMakeLists.txt。

template_matching_project/CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 11)
project(markers)

add_subdirectory(template_matching_library)
set(SRCS main.cpp)
add_executable(${PROJECT_NAME} ${SRCS})
target_link_libraries(${PROJECT_NAME} template_matching ${OpenCV_LIBS})

template_matching_project/template_matching_library/CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 11)
project(template_matching)

# third party
include(ExternalProject)
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/3rdparty)
set(EXTERNAL_DOWNLOAD_LOCATION ${CMAKE_BINARY_DIR}/Download)

# OpenCV
ExternalProject_Add(opencv-contrib
  GIT_REPOSITORY https://github.com/opencv/opencv_contrib.git
  GIT_TAG e6f32c6
  SOURCE_DIR "${EXTERNAL_DOWNLOAD_LOCATION}/opencv-contrib"
  ...
)

ExternalProject_Add(opencv
  GIT_REPOSITORY https://github.com/opencv/opencv.git
  GIT_TAG 01b2c5a
  SOURCE_DIR "${EXTERNAL_DOWNLOAD_LOCATION}/opencv"
  CMAKE_ARGS
    -DBUILD_DOCS:BOOL=OFF
    ...
    -DOPENCV_EXTRA_MODULES_PATH:PATH=${EXTERNAL_DOWNLOAD_LOCATION}/opencv-contrib/modules
)
add_dependencies(opencv opencv-contrib)
set(OpenCV_DIR ${EXTERNAL_INSTALL_LOCATION}/opencv/lib/cmake/opencv4)
find_package(OpenCV REQUIRED PATHS ${EXTERNAL_INSTALL_LOCATION}/opencv)

# set source directories
set(PROJECT_SOURCE_DIR source)
set(INCLUDE_DIR include)

# set source files
file(GLOB_RECURSE SRCS ${PROJECT_SOURCE_DIR}/*)
file(GLOB_RECURSE HEADERS ${INCLUDE_DIR}/*)

# build library
include_directories(${EXTERNAL_INSTALL_LOCATION}/opencv/include/opencv4)
include_directories(${INCLUDE_DIR})

add_library(${PROJECT_NAME} SHARED ${SRCS} ${HEADERS})
add_dependencies(${PROJECT_NAME} opencv)

target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIR})

尽管如此,使用我的两个 CMakeLists.txt,我必须运行两次 cmake 和 make 命令,除非我在 opencv 中出现链接错误,如下所示:

cd build
cmake .. -G "Unix Makefiles
make 
cmake .. -G "Unix Makefiles
make

有没有办法使用单次运行 cmake/make?

我尝试了一些FetchContent,但未能成功。我的 cmake 版本是 3.5.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2023-03-16
    • 1970-01-01
    • 2021-06-09
    • 2014-12-21
    相关资源
    最近更新 更多