美文网首页
cmake常用语法

cmake常用语法

作者: 葫芦娃DayDream | 来源:发表于2020-03-23 19:52 被阅读0次

    在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常用语法

          本文链接:https://www.haomeiwen.com/subject/xzawyhtx.html