视觉SLAM十四讲中Eigen\Ceres\g2o库的CMakeLIsts文件

最近, 学习高翔大神的视觉SLAM十四讲,在学习使用cmake的时候碰到了很多问题,下面给出了加入Eigen\Ceres\g2o\OpenCv库的CMakeLIsts文件。(由于是初学阶段,没有将这几个库单独分开写,但开源项目的代码都是每个库的查找、链接等单独写成一块,还附加一些判断,还得继续学习…)
2019.10.23更新----------------------------------------------------------------------------------

#声明要求的cmake最低版本
cmake_minimum_required(VERSION 3.0.0)
#声明一个cmake工程
project(SLAM VERSION 0.1.0)

#include(CTest)
#enable_testing()

#Release版称为发行版,Debug版称为调试版。
#Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。
#Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。
#Debug版会使用参数-g;Release版使用-O3 –DNDEBUG 
#将优化程度调到最高需要设置 -O3 ,最低的是 -O0 即不做优化
set( CMAKE_BUILD_TYPE "Release" )
# 添加c++ 11标准支持
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

#添加搜索路径
#list(APPEND ${CMAKE_MODULE_PATH}  ~/Downloads/g2o-master/cmake_modules) 
#message("CMAKE_MODULE_PATH :" ${CMAKE_MODULE_PATH})

#旧版本版本的g2o的cmake文件的路径!!
#set(G2O_DIR /media/xshen/OtherVersions1.0/lib/g2o)

#寻找库
#如果找到xxx库,就可以在接下来的语句中使用xxx_INCLUDE_DIRS和xxx_LIBS这两个变量
find_package(Eigen3 REQUIRED)
find_package(OpenCV REQUIRED)  #使用了Config模式,OpenCVConfig.cmake 文件在/usr/local/lib/cmake/opencv4目录下
find_package(Ceres REQUIRED)
find_package(G2O REQUIRED) #根据g2o的cmake文件,G2O必须大写
#Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件.(在/usr/share/cmake-3.10/Modules目录下)
#Config模式:搜索XXX_DIR(如OpenCV_DIR\Eigen3_DIR)指定路径下的XXXConfig.cmake文件.  (有哪些默认搜索路径,如何参看?????)

#给工程添加一个可执行程序
add_executable(SLAM src/main.cpp)



#添加头文件目录
#include_directories("/media/xshen/OtherVersions1.0/include/eigen3")  
#include_directories("/usr/include/eigen3")  
include_directories(SLAM ${EIGEN_INCLUDE_DIRS}) 
#Eigen库只有头文件,所以不需要再用target_link_libraries语句将程序链接到库上!!
include_directories(${OpenCV_INCLUDE_DIRS}) 
include_directories(${G2O_INCLUDE_DIRS}) 

#注意:Ceres和g2o的部分库文件修改了库文件中的头文件目录Eigen/xxx 为eigen3/Eigen/xxx,暂时也没问题
#eigen3目录刚好在/usr/include下,为系统搜索默认搜索目录,
#如果把库文件中的头文件目录改为eigen3/Eigen/xxx,那么即使不添加eigen3头文件也可以找到,但这只是巧合!!
#Ceres和g2o目录就在默认搜索目录/usr/local/include下,故可以不用添加头文件目录

IF(OpenCV_FOUND)
    message("OpenCV lib is found:" ${OpenCV_INCLUDE_DIRS})
    message("OpenCV lib:" ${OpenCV_LIBS}) 
ENDIF(OpenCV_FOUND)
IF(G2O_FOUND)
    message("G2O lib is found:" ${G2O_INCLUDE_DIRS}) 
    message("G2O lib:" ${G2O_LIBRARIES})
ENDIF(G2O_FOUND)


#生成库
add_library(Practice_shared SHARED src/Practice.cpp src/ImageBasics.cpp src/Optimization.cpp src/CalibrationBoard.cpp) 


#给工程链接库
#target_link_libraries里库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面
target_link_libraries(SLAM ${OpenCV_LIBS}) #Practice_shared库不依赖OpenCv库?
target_link_libraries(SLAM Practice_shared)
target_link_libraries(SLAM ${CERES_LIBRARIES}) #libceres.a是静态库,  .so结尾的是动态库
target_link_libraries(SLAM  ${G2O_LIBRARIES})
#问题: target_link_libraries(SLAM Practice_shared) #放在此处会出现 libPractice_shared.so:
#对‘ceres::Problem::~Problem()’未定义的引用这样的情况(应该是链接库的顺序问题)

#set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#include(CPack)


# 注意事项:当切换不同版本的g2o、opencv等编译失败,可能需要将build文件夹删除,重新编译。
# CMakeLists文件的编写可以参考开源代码的编写,如RGBD-SLAM-v2、ORB-SLAM2等。
# 为了便于管理,同一库的查找、链接最好放在一起,如下Eigen相关的单独写在一起,并在开头写上注释。

#############################
# Eigen ####################
#############################
# find_package(Eigen3 REQUIRED)
# include_directories(SLAM ${EIGEN_INCLUDE_DIRS})
# add_definitions(${EIGEN_DEFINITIONS})

2019.7.29------------------------------------------------------------------------------------------

#声明要求的cmake最低版本
cmake_minimum_required(VERSION 3.0.0)
#声明一个cmake工程
project(SLAM VERSION 0.1.0)

#include(CTest)
#enable_testing()

#Release版称为发行版,Debug版称为调试版。
#Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。
#Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。
#Debug版会使用参数-g;Release版使用-O3 –DNDEBUG 
#将优化程度调到最高需要设置 -O3 ,最低的是 -O0 即不做优化
set( CMAKE_BUILD_TYPE "Release" )
# 添加c++ 11标准支持
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

#添加搜索路径
#list(APPEND ${CMAKE_MODULE_PATH}  ~/Downloads/g2o-master/cmake_modules) 
#message("CMAKE_MODULE_PATH :" ${CMAKE_MODULE_PATH})

#寻找库
#如果找到xxx库,就可以在接下来的语句中使用xxx_INCLUDE_DIRS和xxx_LIBS这两个变量
find_package(OpenCV REQUIRED)  #使用了Config模式,OpenCVConfig.cmake 文件在/usr/local/lib/cmake/opencv4目录下
find_package(Ceres REQUIRED)
#find_package(g2o REQUIRED)#为什么g2o不用寻找库也行??
#Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件.(在/usr/share/cmake-3.10/Modules目录下)
#Config模式:搜索XXX_DIR(如OpenCV_DIR\Eigen3_DIR)指定路径下的XXXConfig.cmake文件.  (有哪些默认搜索路径,如何参看?????)

#给工程添加一个可执行程序
add_executable(SLAM src/main.cpp)



#添加头文件目录
include_directories("/usr/include/eigen3")   
#Eigen库只有头文件,所以不需要再用target_link_libraries语句将程序链接到库上!!
include_directories(${OpenCV_INCLUDE_DIRS}) 

#注意:Ceres和g2o的部分库文件修改了库文件中的头文件目录Eigen/xxx 为eigen3/Eigen/xxx,暂时也没问题
#eigen3目录刚好在/usr/include下,为系统搜索默认搜索目录,
#如果把库文件中的头文件目录改为eigen3/Eigen/xxx,那么即使不添加eigen3头文件也可以找到,但这只是巧合!!
#Ceres和g2o目录就在默认搜索目录/usr/local/include下,故可以不用添加头文件目录

IF(g2o_FOUND)
    message("G2O lib is found:" ${g2o_INCLUDE_DIRS}) #目录输出为空?
ENDIF(g2o_FOUND)


#生成库
add_library(Practice_shared SHARED src/Practice.cpp src/ImageBasics.cpp src/Optimization.cpp) 


#给工程链接库
#target_link_libraries里库文件的顺序符合gcc链接顺序的规则,即被依赖的库放在依赖它的库的后面
target_link_libraries(SLAM ${OpenCV_LIBS}) #Practice_shared库不依赖OpenCv库?
target_link_libraries(SLAM Practice_shared)
target_link_libraries(SLAM ${CERES_LIBRARIES}) #libceres.a是静态库,  .so结尾的是动态库
target_link_libraries(SLAM  g2o_stuff   g2o_core )
#问题: target_link_libraries(SLAM  g2o_core g2o_stuff ) #g2o_stuff 放在后面,
#运行时会出现找不到g2o_stuff.so文件(暂未知晓问题原因)
#问题: target_link_libraries(SLAM Practice_shared) #放在此处会出现 libPractice_shared.so:
#对‘ceres::Problem::~Problem()’未定义的引用这样的情况(应该是链接库的顺序问题)



#set(CPACK_PROJECT_NAME ${PROJECT_NAME})
#set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
#include(CPack)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值