以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 )