基本用法
# 声明最低版本类型
cmake_minimum_required( VERSION 2.8)
# 创建一个工程,工程名为hello
project( hello )
# 设置编译模式
# 编译模式有”DEBUG" 和 "RELEASE"
# “DEBUG”为调试模式,可进行断点测试
# "RELEASE"为发行模式,速度更快
set(CMAKE_BUILD_TYPE "DEBUG")
# 增加可执行文件
ADD_EXECUTABLE(hello hello.cpp)
# 增加静态库,以“.a”作为后缀,每次调用都会生成一个副本
ADD_LIBRARY(hello libHello.cpp)
# 增加共享库,以".so"为后缀,只有一个副本
ADD_LIBRARY(hello_shared SHARED libHello.cpp)
ADD_EXECUTABLE(useHello useHello.cpp)
# 使用库前要链接,并在源文件中用头文件引用
TARGET_LINK_LIBRARIES(useHello hello_shared)
# 添加外部头文件
include_directories("dir_path")
常用指令
- PROJECT(prejcetname): 创建工程
- SET(varname src1.cpp src2.cpp):设置变量
- MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR “message to display”)
常用变量
- PROJECT_BINARY_DIR: 指代编译路径
- PROJECT_SOURCE_DIR: 指代工程的路径
- EXECUTABLE_OUTPUT_PATH: 指代可执行文件的保存位置
- LIBRARY_OUTPUT_PATH: 指代库文件的保存位置
- CMAKE_BUILD_TYPE: 指代编译类型,有"DEBUG"和"RELEASE"
基本语法规则
- 指令大小写无关,但变量和参数对大小写敏感
- 变量用${}取值,IF控制语句直接使用变量名
外部构建(out-of-source build)
- 定义:与内部构建对应(in-source build),即在指定路径
进行编译,对原工程几乎没有影响 - 用途:直接编译会在工程目录中产生很多中间文件,使用外部构建的方法可以避免这一问题
- 具体做法:
使用cmake filepath 指定工程路径进行编译, 可在工程目录里新建“build”文件夹,让代码在该文件夹中编译,所有中间文件都会保存在“build”文件夹中
mkdir ./build && cd ./build
cmake ..
make
多层目录结构
- 在工程目录中的CMakeLists.txt中间中,用ADD_SUBDIRECTORY()指令来添加含源文件的目录
- 在需要编译的子目录中的CMakeLists.txt中添加编译可执行文件
指定二进制文件的保存位置
- ADD_SUBDIRECTORY(src bin): 第二个参数为src 目录编译后产生文件的保存位置,此例保存在${PROJECT_BINARY_DIR}/bin中
- SET(EXECUTABLE_OUTPUT_PATH ${VAR})
或者SET(LIBRARY_OUTPUT_PATH ${VAR)
静态库和动态库
- 如何构建动态库和静态库
静态库:ADD_LIBRARY(hello libhello.cpp)
动态库:ADD_LIBRARY(hello_shared SHARED libhello.cpp) - 静态库和动态库不能同名;若要同名,可添加 SET_TARGET_PROPERTIES(libname PROPERTIES OUTPUT_NAME “str”)指令
- 控制动态库版本
使用外部库
- find_package(Pangolin REQUIRED)# 找到头文件和库文件地址
- include_directories(${Pangolin_INCLUDE_DIRS})#引用头文件
- target_link_libraries(exename ${Pangolin_LIBRARIES})#链接库文件(如果需要的话)