gpt4 book ai didi

opencv - 带有opencv addexternal的cmake c++库

转载 作者:行者123 更新时间:2023-12-02 16:24:13 28 4
gpt4 key购买 nike

我想使用cmake构建一个C++库。
该库需要即时下载 opencv并生成,然后该库将在另一个cmake项目中用作库。
项目结构如下:

template_matching_project
|
|-- build
|-- template_matching_project
| |
| |-- template_matching_library
| |
| | -- src
| | -- include
| | -- CMakeLists.txt
|-- main.cpp
|-- CMakeLists.txt
template_matching_library使用opencv执行一些图像处理,template_matching_project / template_matching_library / CMakeLists.txt中包含其cmake文件的内容:
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})
使用此cmake可以正确构建template_matching_library,但是 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中的一个还是两个。
谢谢。

最佳答案

如果有人有任何建议或更好的解决方案,我已经将其与这两个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})
不过,除非使用opencv出现链接错误,否则我确实必须使用两次CMakeLists.txt运行两次cmake并执行命令,如下所示:
cd build
cmake .. -G "Unix Makefiles
make
cmake .. -G "Unix Makefiles
make
有没有办法进行一次单次cmake / make处理?
我尝试了一些 FetchContent,但无法使其正常工作。我的cmake版本是3.5.1

关于opencv - 带有opencv addexternal的cmake c++库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62609655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com