C++ cmake查找自定义包
我在一个文件夹中编写了一系列程序包,我想编写一个使用它们的程序。最主要的是,我想保持文件夹在同一水平,以便有一个更独立的管理。 例如,我有一个名为brisk的包,它必须由另一个名为place_recognition的包使用C++ cmake查找自定义包,c++,cmake,C++,Cmake,我在一个文件夹中编写了一系列程序包,我想编写一个使用它们的程序。最主要的是,我想保持文件夹在同一水平,以便有一个更独立的管理。 例如,我有一个名为brisk的包,它必须由另一个名为place_recognition的包使用 cpp | -- brisk | | | --CMakeLists.txt | | | --release | | | | | --lib --etc... -- place_recognition | | | --cmake
cpp
|
-- brisk
| |
| --CMakeLists.txt
| |
| --release
| | |
| | --lib
--etc...
-- place_recognition
| |
| --cmake
| |
| -- CMakeLists.txt
| |
| -- src
| |
| -- include
我编写了一个FindBrisk.cmake文件,并将其添加到我的place_识别项目中
获取\u文件名\u组件Brisk\u当前\u配置\u目录
${CMAKE_当前_列表_文件}路径
set(BRISK_EXPORTED_BUILD_DIR ${BRISK_CURRENT_CONFIG_DIR})
get_filename_component(BRISK_EXPORTED_SOURCE_DIR
${BRISK_EXPORTED_BUILD_DIR}/../../brisk/ ABSOLUTE)
set(BRISK_INCLUDE_DIR "${BRISK_EXPORTED_SOURCE_DIR}/include")
set(BRISK_LIBRARY_DIR "${BRISK_EXPORTED_SOURCE_DIR}/release/lib")
set(BRISK_FOUND True)
set(BRISK_LIBRARIES "${BRISK_EXPORTED_SOURCE_DIR}/release/lib/libbrisk.a")
set(AGAST_INCLUDE_DIR "${BRISK_EXPORTED_SOURCE_DIR}/agast/include")
set(AGAST_LIBRARIES "${BRISK_EXPORTED_SOURCE_DIR}/release/lib/libagast.a")
set(AGAST_FOUND True)
mark_as_advanced(BRISK_INCLUDE_DIR BRISK_LIBRARY_DIR BRISK_LIBRARIES AGAST_INCLUDE_DIR AGAST_LIBRARIES)
我将其包含在此处报告的CMakeLists.txt中
cmake_minimum_required(VERSION 2.8.11)
project(place_recognition)
#set up the output tree
set(CMAKE_BINARY_DIR ${PROJECT_SOURCE_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(Brisk REQUIRED)
find_package( OpenCV REQUIRED )
include_directories(BEFORE ${OpenCV_INCLUDE_DIRS})
if(BRISK_FOUND)
message(STATUS "Found BRISK in " ${BRISK_INCLUDE_DIR})
else(BRISK_FOUND)
message(STATUS "BRISK NOT FOUND")
endif(BRISK_FOUND)
# copy all needed files to binary dir (when cmake)
file(GLOB files_needed
dataset/*
)
file(COPY ${files_needed} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
include_directories(
include
${BRISK_INCLUDE_DIR}
${AGAST_INCLUDE_DIR}
)
add_definitions(-mssse3 -DAGAST_GLOG -Werror -Wextra -Wall -pedantic -std=c++0x)
add_executable(
${PROJECT_NAME}
src/main.cpp
)
link_directories(
${BRISK_LIBRARY_DIR}
)
target_link_libraries(
${PROJECT_NAME}
${OpenCV_LIBS}
${AGAST_LIBRARIES}
${BRISK_LIBRARIES}
)
然而,我有一种奇怪的行为。当我试图编译代码时,编译器无法找到brisk包的依赖项,我被要求将它们显式地包含在我的cmake文件中,在我的示例中,我必须使用OpenCV。因为brisk现在也使用GLOG,所以在尝试编译时出现以下错误
链接CXX可执行文件../bin/place\u
/home/andrea/development/cpp/brisk/release/lib/libbrisk.abrisk scale space.cc.o:
在功能上
brisk::BriskScaleSpace::GetKeypointsstd::vector*':
brisk scale space.cc:.文本+0x4690:未定义对的引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量和'brisk scale space.cc:.text+0x469d:
对google::LogMessageFatal::~LogMessageFatal'的未定义引用
/home/andrea/development/cpp/brisk/release/lib/libbrisk.abrisk layer.cc.o:
在functionbrisk::BriskLayer::GetAgasPointSunsigned char中,
std::vector>':
brisk layer.cc:.text+0x14c:对的未定义引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量和'brisk layer.cc:.text+0x156:未定义
日志引用::LogMessageFatal::~LogMessageFatal'
/home/andrea/development/cpp/brisk/release/lib/libbrisk.abrisk layer.cc.o:
在函数brisk::BriskLayer::BriskLayercv::Mat const&,无符号
char,unsigned char,float,float':brisk layer.cc:.text+0x29ef:
对agast::OASTDetector 9_16'vTable的未定义引用
brisk layer.cc:.text+0x2b4d:对vtable的未定义引用
agast::AgastDetector5_8'
/home/andrea/development/cpp/brisk/release/lib/libbrisk.abrisk layer.cc.o:
在函数Brisk::BriskLayer::BriskLayer Brisk::BriskLayer const&,
int,unsigned char,unsigned char':brisk layer.cc:.text+0x32e3:
对agast::OastDetector 9_16'vtable的未定义引用
brisk layer.cc:.text+0x3456:未定义对vTable的引用
agast::AgastDetector5_8'
/home/andrea/development/cpp/brisk/release/lib/libbrisk.aimage down sampling.cc.o:
在函数brisk::Halfsample16cv::Mat const&,cv::Mat&'中:
图像下采样.cc:.text+0xc4e:对的未定义引用
google::LogMessageFatal::LogMessageFatalchar常量,int,
google::CheckOpString常量&“图像下采样.cc:.文本+0xc56:
对google::LogMessage::stream'的未定义引用
图像下采样.cc:.text+0xc5e:对的未定义引用
谷歌::LogMessageFatal::~LogMessageFatal'
图像下采样.cc:.text+0xcab:未定义对的引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量&'image down sampling.cc:.text+0xcb3:
未定义对日志::日志消息::流的引用'
图像下采样.cc:.text+0xd02:对的未定义引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量&'image down sampling.cc:.text+0xd0a:
未定义对日志::日志消息::流的引用'
/home/andrea/development/cpp/brisk/release/lib/libbrisk.aimage down sampling.cc.o:
在函数brisk::Halfsample8cv::Mat const&,cv::Mat&'中:
图像下采样.cc:.text+0x1227:对的未定义引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量&'image down sampling.cc:.text+0x122f:
对google::LogMessage::stream'的未定义引用
图像下采样.cc:.text+0x1237:对的未定义引用
谷歌::LogMessageFatal::~LogMessageFatal'
图像下采样.cc:.text+0x1280:对的未定义引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量&'image down sampling.cc:.text+0x1288:
未定义对日志::日志消息::流的引用'
/home/andrea/development/cpp/brisk/release/lib/libbrisk.aimage down sampling.cc.o:
在函数brisk::Twothirdsample8cv::Mat const&,cv::Mat&'中:
图像下采样.cc:.text+0x168f:对的未定义引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量&'image down sampling.cc:.text+0x1697:
对google::LogMessage::stream'的未定义引用
图像下采样.cc:.text+0x169f:对的未定义引用
谷歌::LogMessageFatal::~LogMessageFatal'
图像下采样.cc:.text+0x16e5:对的未定义引用
google::LogMessageFatal::LogMessageFatalchar常量*,int,
google::CheckOpString常量&'image down sampling.cc:.text+0x16ed:
未定义对日志::日志消息::流的引用'
/home/andrea/development/cpp/brisk/release/lib/libbris
k、 目标向下采样。抄送o:
在函数std::string*google::MakeCheckOpStringint中
常量&,整型常量&,字符常量*':
图像下采样.cc:.文本._zn6Google17MakeCheckOpStringIIiepSkt_RKT0_PKc[_zn6Google17MakeCheckOpStringIIiepSkt_RKT0PKC]+0x15:
未定义的引用
google::base::CheckOpMessageBuilder::CheckOpMessageBuilderchar
常数*'
图像下采样.cc:.文本._zn6Google17MakeCheckOpStringIIiepSkt_RKT0_PKc[_zn6Google17MakeCheckOpStringIIiepSkt_RKT0_PKc]+0x2c:
未定义的引用
google::base::CheckOpMessageBuilder::ForVar2'
image down sampling.cc:.text._zn6Google17MakeCheckOpStringIIiepSkt_RKT0_PKc[_zn6Google17MakeCheckOpStringIIiepSkt_RKT0_PKc]+0x40:
未定义的引用
google::base::CheckOpMessageBuilder::NewString'
图像下采样.cc:.文本._zn6Google17MakeCheckOpStringIIiepSkt_RKT0_PKc[_zn6Google17MakeCheckOpStringIIiepSkt_RKT0_PKc]+0x4f:
未定义的引用
google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder'
image down sampling.cc:.text.\u zn6Google17MakeCheckOpStringIIiepSkt\u RKT0\u PKc[\u zn6Google17MakeCheckOpStringIIiepSkt\u RKT0\u PKc]+0x68:
未定义的引用
google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder'
collect2:错误:ld返回了1个退出状态make[2]:*
[../bin/place\u recognition]错误1生成[1]:*
[cmakfiles/place_recognition.dir/all]错误2生成:**[all]错误2
我做错了什么?
谢谢
Andrea如果eigen是你的树的一部分,搜索它有什么意义?只需使用它。它与camera_simulation文件夹处于同一级别。我如何使用它?你的意思是说通过做一些像include.././eigen/eigen/src/etc这样的事情?使用顶级的CMakeLIsts.txt,其中设置了目标的依赖关系,加上cmake支持相对路径,所以你可以使用../eidgenI实际上没有顶级的cmake目标,我不想拥有它,这就是为什么我试图在功能上使用find包,找导游是个离题的话题。你可以试着跟随。此外,您还可以查看cmake附带的现有find*.cmake模块:大多数模块都非常简单,无法理解,请遵循上面的指南。