Cmake语法

1 说明

本文主要介绍如何用 CMake 为工程指定编译环境,包括编译需要的库,这些库可以是通过 CMake 编译安装在系统中的,也可以是自定义编译在其他目录下的。

2 指定编译器

默认是系统的 gcc 版本,用 gcc -v 查看,在交叉编译时可以指定编译器:

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

3 添加编译选项

用于在 gcc/g++ 后面添加参数:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -g -DXXX")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -g -DXXX")
// 编译选项自定义

常见的一些参数:(其他参数参考这里

参数含义
-Dmacro相当于#define macro
-Dmacro=defn相当于 #define macro=defn
-g编译时产生调试信息
-std=c++11指定c/c++的标准

4 Release 和 Debug

默认情况下是编译的 Release,指定 Debug 有两种方式:

  • 命令行传入参数
    $ cmake -DCMAKE_BUILD_TYPE=Debug
    
  • cmake 语句
    set(CMAKE_BUILD_TYPE "Debug")
    

5 打印语句

message($(CMAKE_BUILD_TYPE))

6 创建变量

set(XXX_INCLUDE_DIR /usr/include)
set(XXX_INCLUDE_DIR "aaa bbb ccc") # 如果包含空格,需要加上引号,否则空格会被忽略

7 查找系统安装包

从系统中查找已经安装的库(该库是按照 CMake 编译安装的),会生成相关的变量,比如查找的库名为 XXX,执行:

find_package(XXX REQUIRED)
#find_package(XXX REQUIRED COMPONENTS filesystem) # 查找该库的指定模块,如 filesystem

判断是否找到:

if (NOT XXX_FOUND)
    message("Not found Boost")
endif ()

查找该库后,会生成该库的相关变量,比如:

XXX_FOUND                        # 是否找到
XXX_INCLUDE_DIRS 或 XXX_INCLUDES # 头文件目录
XXX_LIBRARIES    或 XXX_LIBS     # 库文件
XXX_DEFINITIONS

这些变量会在后面的命令中使用。

8 添加头文件查找目录

整个 CMake 编译环境添加头文件目录,相当于 g++ 的 -l 参数。

语法:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

# 变量路径
include_directories(${XXX_INCLUDE_DIR}) # 可添加多项,以空格分开
# 自定义路径
include_directories(/home/tamray/caffe/include)

9 添加库文件查找目录

整个 CMake 编译环境添加库文件目录,后面的 link_libraries、target_link_libraries 就可以只添加库名就行(如caffe、libcaffe.so),它会自动在已包含的库文件目录中查找。

语法:
link_directories(directory1 directory2 ...)

# 变量路径
link_directories(${XXX_LIBS_DIR})
# 自定义路径
link_directories("/home/tamray/caffe/build/lib")

10 添加库

整个 CMake 编译环境添加库文件。

# 直接是全路径
link_libraries(“/home/tamray/caffe/build/lib/libcaffe.so”)
# 下面的例子,只有库名,cmake会自动去所包含的目录搜索
link_libraries(caffe)
# 传入变量
link_libraries(${RUNTIME_LIB})

11 查找库

从指定目录下查找某库,将该库的路径存放在变量中

# 从该目录中查找 libcaffe.so,若没找到,赋值为 NO_DEFAULT_PATH
find_library(RUNTIME_LIB caffe /home/tamray/caffe/build/lib  NO_DEFAULT_PATH)

12 添加目标文件

add_executable(demo
        main.cpp
)
# 为 demo 添加库文件
target_link_libraries(demo libcomm.so)  
target_link_libraries(demo ${XXX_LIBS}) 

例子

编写 CMakeLists.txt

#SET(CMAKE_CXX_FLAGS "-std=c++11 -O3")

cmake_minimum_required(VERSION 2.8)
project(ch6)

set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "-std=c++14 -O3")

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

# OpenCV
## 查找opencv库
find_package(OpenCV REQUIRED)
## 包含opencv头文件
include_directories(${OpenCV_INCLUDE_DIRS})

# Boost
#set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1)           # 如果boost是自定义安装路径,需要手动设置头文件、库的路径
#set(Boost_LIBRARY_DIR /usr/local/src/boost_1_46_1/stage/lib) #
find_package(Boost REQUIRED COMPONENTS filesystem) # 表示使用boost的filesystem组件
include_directories(${Boost_INCLUDE_DIRS})
if (NOT Boost_FOUND) # 判断是否找到
    message("Not found Boost")
endif ()
message("打印: ${Boost_INCLUDE_DIRS}") # 打印变量

# Ceres
find_package(Ceres REQUIRED)
include_directories(${CERES_INCLUDE_DIRS})

# g2o
find_package(G2O REQUIRED)
include_directories(${G2O_INCLUDE_DIRS})

# Eigen
include_directories("/usr/include/eigen3")

## 添加可执行目标
add_executable(gaussNewton gaussNewton.cpp)
## 为目标添加库
target_link_libraries(gaussNewton ${OpenCV_LIBS})

add_executable(g2oCurveFitting g2oCurveFitting.cpp)
target_link_libraries(g2oCurveFitting ${OpenCV_LIBS} ${G2O_CORE_LIBRARY} ${G2O_STUFF_LIBRARY})
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值