cmake常用语法

在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语法介绍

语法

  1.   #注释
    
  2. 变量:使用set命令显式定义及赋值,在非if语句中,使用${}引用,if中直接使用变量名引用;后续的set命令会清理变量原来的值;
  3. command (args ...) #命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格
  4. set(var a;b;c) <=> set(var a b c) #定义变量var并赋值为a;b;c这样一个string list
  5. Add_executable(${var}) <=> Add_executable(a b c) #变量使用${xxx}引用
  6.   条件语句:
      if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT
      …
     else()/elseif() … endif(var)
    
  7.   循环语句
       Set(VAR a b c)
       Foreach(f ${VAR})       …Endforeach(f)
    
  8.  循环语句
      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

你可能感兴趣的:(cmake常用语法)