Cmake学习

以VINS-Mono为例

选择C++版本

  • 在Cmakelist中可以选择C++版本,可别小瞧这个C++版本,很多时候,例如智能指针等都是高版本(C++17、C++20)才可以使用的;
  • 如果代码里有指针问题一直不能解决,可以考虑一下是否为C++版本的问题;

find_package

  • 功能:查找指定的库文件
find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    geometry_msgs
    nav_msgs
    tf
    cv_bridge
    )
find_package(OpenCV REQUIRED) 
find_package(Ceres REQUIRED)

  • 以PCL库为例,如果没有把PCL加入到find_package中,肯定找不到对应的PCL头文件;

include_directories

  • 功能:其实可以理解为#include,只不过这是cmakelist中的include,不是单纯cpp文件中的include;
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS})
include_directories(
  ${catkin_INCLUDE_DIRS}
  ${EIGEN3_INCLUDE_DIR}
)

  • 有的工程文件中,会自带第三方库(文件夹名一般是thirdparty),这一般是作者准备好的第三方库文件,所以要在cmakelist中,将这个第三方库也include_directories:
include_directories(thirdparty/Sophus)

自定义库

步骤一:add_library

  • 功能:使用多个cpp,来自定义一个库
add_library(lio2 SHARED
  src/Lidar/LidarKeypointExtractor.cpp
  src/config/lio_parameter.cpp
  #src/config/lio_parameter2.cpp
  src/Frontend/LidarFrontend.cpp
  src/Backend/LidarBackend.cpp
  src/factor/lio_factor/imu_factor.cpp
  src/factor/lio_factor/line_factor.cpp
  src/factor/lio_factor/LocalParameterizationBase.cpp
  src/factor/lio_factor/plane_factor.cpp
  src/factor/lio_factor/pose_parameterization.cpp
  src/factor/lio_factor/pose_prior_factor.cpp
  # src/features/velodyne_feature.cpp
  src/myso3/myso3.cpp
  #src/config/parameter.cpp
)

其中SHARED可以不用加;

  • Radar中的Cmakelist:
add_library(features
  src/features.cpp
)

target_link_libraries(features
  ${catkin_LIBRARIES}
  ${OpenCV_LIBRARIES}
  ${Boost_INCLUDE_DIRS}
    Eigen3::Eigen
)

步骤二:target_link_libraries

  • 功能:为add_library中的文件提供“公共库”
target_link_libraries(lio2 PUBLIC
  tbb
  ${catkin_LIBRARIES}
  ${GFLAGS_LIBRARIES}
  ${GLOG_LIBRARIES}
  ${OpenCV_LIBS}
  ${CERES_LIBRARIES}
  ${PCL_LIBRARIES})
  • Rdar中为:
target_link_libraries(features
  ${catkin_LIBRARIES}
  ${OpenCV_LIBRARIES}
  ${Boost_INCLUDE_DIRS}
    Eigen3::Eigen
)

步骤三:target_include_directories

  • 非必须
  • 功能:为add_library中的文件提供“头文件”
target_include_directories(lio2 PUBLIC
  include
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS})

定义可执行文件

步骤一:add_executable

  • 功能:生成可执行文件,使用的cpp文件必须含有main函数;
add_executable(vins_estimator
    src/estimator_node.cpp
    src/parameters.cpp
    src/estimator.cpp
    src/feature_manager.cpp
    src/factor/pose_local_parameterization.cpp
    src/factor/projection_factor.cpp
    src/factor/projection_td_factor.cpp
    src/factor/marginalization_factor.cpp
    src/utility/utility.cpp
    src/utility/visualization.cpp
    src/utility/CameraPoseVisualization.cpp
    src/initial/solve_5pts.cpp
    src/initial/initial_aligment.cpp
    src/initial/initial_sfm.cpp
    src/initial/initial_ex_rotation.cpp
    )

从上面的代码中,可以看出,add_executable的格式为:

add_executable(可执行文件的name  可执行文件对应的cpp文件   source)

注意!add_executable中可执行文件对应的cpp,必须有main函数,而source中的cpp文件中,绝对不能有main函数;

其实,source中的cpp文件,都是“子函数”,就是给“可执行文件cpp”定义函数的!

步骤二:target_link_libraries

  • 功能:为可执行文件cpp链接“公共库”
target_link_libraries(vins_estimator ${catkin_LIBRARIES} ${OpenCV_LIBS} ${CERES_LIBRARIES}       lio2  ) 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值