Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cmake查找自定义包_C++_Cmake - Fatal编程技术网

C++ cmake查找自定义包

C++ cmake查找自定义包,c++,cmake,C++,Cmake,我在一个文件夹中编写了一系列程序包,我想编写一个使用它们的程序。最主要的是,我想保持文件夹在同一水平,以便有一个更独立的管理。 例如,我有一个名为brisk的包,它必须由另一个名为place_recognition的包使用 cpp | -- brisk | | | --CMakeLists.txt | | | --release | | | | | --lib --etc... -- place_recognition | | | --cmake

我在一个文件夹中编写了一系列程序包,我想编写一个使用它们的程序。最主要的是,我想保持文件夹在同一水平,以便有一个更独立的管理。 例如,我有一个名为brisk的包,它必须由另一个名为place_recognition的包使用

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模块:大多数模块都非常简单,无法理解,请遵循上面的指南。