cmake是一个跨平台的编译(安装)工具,可以在linux下生成makefile,在Windows下生成project。方便代码的跨平台移植,在linux中避免了makefile的编写。
本教程为入门时笔记,随时更新。
1.语法规则
(1)cmake的指令大小写都可以使用,例如SET()
可以写成set()
。
(2)变量有大小写之分,例如SRC_LIST
与src_list
不同。
(3)变量使用方式,在取值时采用${SRC_LIST}
取值,但是在IF语句中直接使用变量名。
(4)参数使用空格或;分隔。也可以使用括号()扩起。
2.外部构建
将构建过程中的中间临时文件与源代码分离,方式:
在源代码文件夹下单独创建一个放置生成工程的空文件夹,例如build,在build中运行cmake ..
命令即可。其中“..
”表示父目录。
3.目录变量
该变量为定义好的变量,不需要再定义。
变量PROJECT_BINARY_DIR
表示生成的工程文件的地址。
变量PROJECT_SOURCE_DIR
表示源文件的地址。
可使用如下代码打印:
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${PROJECT_SOURCE_DIR})
4.定义变量
set(SRC_LIST idealrobot.hpp robot.hpp robot.cpp gamepad.hpp
main.cpp)
将变量SRC_LIST定义为后面所示的文件。
5.注释
命令行前加#
6.指定cmake版本
cmake_minimum_required(VERSION 2.4)
7.project指定项目名称
project(haha)
如上项目名称为haha。
8.设置变量
set(SRC_LIST idealrobot.hpp robot.hpp robot.cpp gamepad.hpp
main.cpp)
9.添加include头文件的搜索路径
include_directories(./include)
上式确定头文件目录为CMakeLists所在文件夹下的include文件夹。
10.添加动态链接库或静态链接库的搜索路径
link_directories(/usr/lib)
添加的路径为/usr/lib文件夹。
11.生成工程
add_executable(telerobot ${SRC_LIST})
将SRC_LIST
变量所代表的文件进行编译,生成工程。
12.指令链接的动态库或静态库
target_link_libraries(telerobot libAria.so pthread)
只能链接该指令之前link_directories()
路径中的库。
13.编译选项设置
target_compile_options(telerobot PRIVATE -std=c++11)
f必须在目标工程已经存在的情况下使用,即add_executable()
或 add_library()
之后。
14.简单模板
cmake_minimum_required(VERSION 2.4)
project(telerobot)
set(SRC_LIST idealrobot.hpp robot.hpp robot.cpp gamepad.hpp
main.cpp)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb ")
SET(CMAKE_CXX_FLAGS_RELEASE "${ENV{CXXFLAGS} -O3 -Wall")
include_directories(./include)
link_directories(/usr/lib)
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${PROJECT_SOURCE_DIR})
add_executable(telerobot ${SRC_LIST})
target_link_libraries(telerobot libAria.so pthread)
target_compile_options(telerobot PRIVATE -std=c++11)
set(CMAKE_CONFIGURATION_TYPES "Release")
WALDM