【发布时间】: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。我设法使用此解决方案,以防它可能对其他人有用或可能出现其他建议