cmake_minimum_required(VERSION 3.12)
project(algorithm)
set(CMAKE_CXX_STANDARD 14)
add_executable(algorithm main.cpp)
上面是clion新建一个项目只有一个main.c时自动生成的CMakeLists.txt里的内容。
project指令:
定义工程的名称并可指定工程支持的语言,语言可省略,默认支持所有的语言。
project(project_name [code_lanaguage] )
set指令:
可以用来显式的定义变量。
上面的意思是CMAKE_CXX_STANDARD = 14;
set(VAR `[VALUE][CACHE TYPE DOCSTRING [FORCE]]`)
比如我们用到的是 SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:
SET(SRC_LIST main.c t1.c t2.c)
假如你的项目中只有下面4个源文件main.cpp、mod.hpp、mod_func1.cpp、mod_func2.cpp。因为cmake可以很轻松地解析出各文件的依赖关系,因此CMakeLists.txt其实十分简单:
cmake_minimum_required(VERSION 2.8)
add_executable(Main
main.cpp
mod_func1.cpp
mod_func2.cpp
)
假如你的项目的文件结构如下:
项目名/
main.cpp
mod1.hpp
mod1/
func1.cpp
func2.cpp
mod2.hpp
mod2/
func1.cpp
func2.cpp
一般有以下两种方法:
在项目的根目录下编写CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
add_executable(Main
main.cpp
mod1/func1.cpp
mod1/func2.cpp
mod2/func1.cpp
mod2/func2.cpp
)
推荐使用这种方法,虽然它看似要编写的代码会增多,但由于更加模块化,管理起来会更加轻松。
#CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_subdirectory(mod1)
add_subdirectory(mod2)
add_executable(Main main.cpp)
target_link_libraries(Main Mod1 Mod2)
#mod1/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_library(Mod1 STATIC
func1.cpp
func2.cpp
)
#mod2/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_library(Mod2 STATIC
func1.cpp
func2.cpp
)
主文件夹下:
cmake_minimum_required( VERSION 2.8 )
project ( myslam )
set( CMAKE_CXX_COMPILER "g++" )
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin )
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )
############### dependencies ######################
# Eigen 包含头文件
include_directories("/usr/local/Cellar/eigen/3.3.7/include/eigen3")
# OpenCV
find_package( OpenCV 3.1 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
# Sophus
find_package( Sophus REQUIRED )
include_directories( ${Sophus_INCLUDE_DIRS} )
# G2O
find_package( G2O REQUIRED )
include_directories( ${G2O_INCLUDE_DIRS} )
set( THIRD_PARTY_LIBS
${OpenCV_LIBS}
${Sophus_LIBRARIES}
g2o_core g2o_stuff g2o_types_sba
)
############### source and test ######################
include_directories( ${PROJECT_SOURCE_DIR}/include )
add_subdirectory( src )
add_subdirectory( test )
test文件夹:
add_executable( run_vo run_vo.cpp )
target_link_libraries( run_vo myslam )
src文件夹下:
add_library( myslam SHARED
frame.cpp
mappoint.cpp
)
target_link_libraries( myslam
${THIRD_PARTY_LIBS}
)
下面是ROS下面的cmake编写
# 主要分成六个步骤,非常直观
# 1.指定版本
cmake_minimum_required(VERSION 2.8.3)
# 2.指定项目
project(VIEKFSLAM2)
# 3.找到对应的包 opencv或者eigen3
find_package(Eigen3 REQUIRED)
find_package(OpenCV REQUIRED)
# 4.包含头文件所在的文件夹
include_directories(
include
${catkin_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
${OpenCV_INCLUDE_DIRS}
)
# 5.生成可执行程序
add_executable(vi_ekfslam_node src/vi_ekfslam_node.cpp src/vi_ekfslam.cpp)
# 6.将链接库链接到可执行程序中
target_link_libraries(vi_ekfslam_node
${catkin_LIBRARIES}
${OpenCV_LIBRARIES})
正常的cmake文件如下: 主要分成六个部分
# 1.指定版本
cmake_minimum_required( VERSION 2.8 )
# 2.指定项目
project( imageBasics )
# 添加c++ 11标准支持
set( CMAKE_CXX_FLAGS "-std=c++11" )
# 3.找到对应的包 opencv或者eigen3
find_package( OpenCV REQUIRED )
# 4.包含头文件所在的文件夹
include_directories( ${OpenCV_INCLUDE_DIRS} )
# 5.生成可执行程序
add_executable( imageBasics imageBasics.cpp )
# 6.将链接库链接到可执行程序中
target_link_libraries( imageBasics ${OpenCV_LIBS} )
小觅相机:
find_package(mynteye REQUIRED)
message(STATUS "Found mynteye: ${mynteye_VERSION}")
target_link_libraries( run_mynt
mynteye )
openCV的下载
这里介绍了opencv的安装过程。
openCV 在cmake过程中需要提前下载的,然后放到对应文件夹中,不然在直接下载很容易失败。
查看opencv的版本`pkg-config opencv --modversion `
缺少依赖项:`sudo apt-get install libglew-dev glew-utils`
pkg-config opencv --modversion
安装完成后,在/usr/local/include/ceres 下找到 Ceres 的头文件,并 在/usr/local/lib/下找到名为 libceres.a 的库文件。有了头文件和库文件,就可以使用 Ceres 进行优化计算了。
另外,安装日志libgoogle-glog-dev libgtest-dev
,安装依赖项目:
sudo apt-get install liblpack-dev libsuitesparse-dev libcxsparse3.1.4 libgflags-dev
sudo apt-get install cmake libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-dev
然后再运行g2o(编译),卸载g2ohttps://blog.csdn.net/HelloJinYe/article/details/100827753
fatal error: cs.h: 没有那个文件或目录
include_directories("/usr/local/include/g2o/EXTERNAL/csparse")
报错:fatal error: cs.h: No such file or directory
参考:https://blog.csdn.net/weixin_44436677/article/details/106095485?fps=1&locationNum=2
$echo 'sudo apt-get update' >> build.sh #向build.sh文件写入内容
$chmod +x build.sh #生成可执行程序
$./build.sh #执行可执行程序
$nano build.sh #编辑