在centos操作系统下安装cmake
wget https://cmake.org/files/v3.6/cmake-3.6.0.tar.gz
tar -zxvf cmake-3.10.2.tar.gz
cd cmake-3.6.0
./bootstrap --prefix=安装目录(默认为/usr/local)
make
make install
打开新的终端,输入vim .bashrc
export PATH=$PATH:/home/dc2-user/cmake-3.6.0-Linux-x86 64/bin
使用cmake编译一个可执行文件
假如我们在centos环境下有一个有如下需要编译的c文件
现在我们需要把src文件夹和include文件夹下的代码编译成一个可执行文件。
首先我们创建一个CMakeLists.txt文件
然后我们在CMakeList.txt里面编写我们的脚本
#支持的最低版本
cmake_minimum_required(VERSION 3.4.1)
#要生成的库
PROJECT(myapp)
#导入头文件目录
INCLUDE_DIRECTORIES(
include
)
#指定源文件的目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#SET方法设置变量
SET(TEST_MATH ${DIR_SRCS})
#把可执行的文件放到哪个目录下,编译成可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} $(TEST_MATH))
接着进入build文件夹,然后执行cmake .. 命令,再执行make命令,这样就生成myapp可执行文件了。
常见的语法命令
这里的${CMAKE_CURRENT_SOURCE_DIR}表示CMakeLists.txt所在的目录
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #cmake 最低版本要求,低于2.6 构建过程会被终止。 PROJECT(server_project) #定义工程名称
MESSAGE(STATUS "Project: SERVER") #打印相关消息消息
SET(CMAKE_BUILE_TYPE DEBUG) #指定编译类型
ADD_SUBDIRECTORY(utility) #添加子目录
SET(SOURCE_FILES #设置变量,表示所有的源文件
ConfigParser.cpp
StrUtility.cpp
)
INCLUDE_DIRECTORIES( #相关头文件的目录
/usr/local/include
${PROJET_SOURCE_DIR}/utility
)
TARGET_LINK_LIBRARY(association core) #依赖的库文件
SET_TARGET_PROPERTIES(utility PROPERTIES) #表示生成的执行文件所在路径
LINK_DIRECTORIES(...) #库文件存放的目录,在程序连接库文件的时候要再这些目录下寻找对应的库文件
SET_TARGET_PROPERTIES #设置编译的库文件存放的目录,还可用于其他属性的设置。如不指定,生成的执行文件在当前编译目录下的各子目录下的build目录下
SHARED 表示生成动态库, STATIC表示生成静态库。
cmake语法介绍
语法
#注释
- 变量:使用set命令显式定义及赋值,在非if语句中,使用${}引用,if中直接使用变量名引用;后续的set命令会清理变量原来的值;
- command (args ...) #命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格
- set(var a;b;c) <=> set(var a b c) #定义变量var并赋值为a;b;c这样一个string list
- Add_executable(${var}) <=> Add_executable(a b c) #变量使用${xxx}引用
条件语句: if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT … else()/elseif() … endif(var)
循环语句 Set(VAR a b c) Foreach(f ${VAR}) …Endforeach(f)
循环语句 WHILE() … ENDWHILE()
内部变量
PROJECT_SOURCE_DIR:工程根目录;
PROJECT_BINARY_DIR:运行cmake命令的目录。笔者建议定义为${PROJECT_SOURCE_DIR}/build下。具体原因见后文外部编译部分;
CMAKE_INCLUDE_PATH:环境变量,非cmake变量;
CMAKE_LIBRARY_PATH:环境变量;
CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件所在路径;
CMAKE_CURRENT_BINARY_DIR:target编译目录;
使用ADD_SURDIRECTORY指令可以更改该变量的值;
SET(EXECUTABLE_OUTPUT_PATH < dir >) 指令不会对该变量有影响,但改变了最终目标文件的存储路径;
CMAKE_CURRENT_LIST_FILE:输出调用该变量的CMakeLists.txt的完整路径;
CMAKE_CURRENT_LIST_LINE:输出该变量所在的行;
CMAKE_MODULE_PATH:定义自己的cmake模块所在路径;
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置;
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置;
PROJECT_NAME:返回由PROJECT指令定义的项目名称;
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用来控制IF...ELSE...语句的书写方式;
CMAKE_MAJOR_VERSION cmake主版本号,如2.8.6中的2
CMAKE_MINOR_VERSION cmake次版本号,如2.8.6中的8
CMAKE_PATCH_VERSION cmake补丁等级,如2.8.6中的6
CMAKE_SYSTEM 系统名称,例如Linux-2.6.22
CMAKE_SYSTEM_NAME 不包含版本的系统名,如Linux
CMAKE_SYSTEM_VERSION 系统版本,如2.6.22
CMAKE_SYSTEM_PROCESSOR 处理器名称,如i686
UNIX 在所有的类UNIX平台为TRUE,包括OS X和cygwin
WIN32 在所有的win32平台为TRUE,包括cygwin
命令
project (HELLO) #指定项目名称,生成的VC项目的名称;
使用${HELLO_SOURCE_DIR}表示项目根目录
include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数
include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录
link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link目录
add_subdirectory:包含子目录
add_subdirectory (Hello)
add_executable:编译可执行程序,指定编译,好像也可以添加.o文件
add_executable (helloDemo demo.cxx demo_b.cxx) #将cxx编译成可执行文件——
add_definitions:添加编译参数
add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;
add_definitions( “-Wall -ansi –pedantic –g”)
target_link_libraries:添加链接库,相同于指定-l参数
target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo
add_library:
add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a
add_custom_target:
message( status|fatal_error, “message”):
推荐阅读常用变量的博客 https://www.jianshu.com/p/9d246e4071d4