cmake学习笔记

1.cmake 常用的一些宏

    PROJECT_BINARY_DIR     CMAKE_BINARY_DIR  工程二进制文件输出目录

    PROJECT_SOURCE_DIR   CMAKE_SOURCE_DIR   工程顶层目录

    EXECUTABLE_OUTPUT_PATH  可执行文件输出目录

    LIBRARY_OUTPUT_PATH     库文件输出目录

   CMAKE_INSTALL_PREFIX   安装位置前缀   相对路径

   OUTPUT_NAME  二进制输出名字

   VERSION  动态库版本    SOVERSION 指代API版本

    两个环境变量(不是cmake变量):CMAKE_INCLUDE_PATH 和CMAKE_LIBRARY_PATH

    CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在路径

    CMAKE_CURRENT_BINARY_DIR  :target编译目录

    CMAKE_CURRENT_LIST_FILE  输出调用这个变量的CMakeLists.txt的完整路径

    CMAKE_CURRENT_LIST_LINE  输出这个变量所在的行

    CMAKE_MODULE_PATH 这个变量用来定义自己的cmake模块所在的路径

系统信息变量

    CMAKE_MAJOR_VERSION  CMAKE 主版本号

    CMAKE_MINOR_VERSION   CMAKE 次版本号

    CMAKE_PATCH_VERSION   CMAKE 补丁等级

    CMAKE_SYSTEM  系统名称

     CMAKE_SYSTEM_NAME  不包含版本的系统名 

     CMAKE_SYSTEM_VERSION 系统版本号

     CMAKE_SYSTEM_PROCESSOR 处理器名称   比如i686

     UNIX  在所有的类UNIX平台为TRUE 包括OS  X和cygwin

     WIN32,在所有的win32平台为TRUE,包括cygwin

主要开关选项

    CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来 控制IF ESLE 语法的书写方式,

    BUILD_SHARED_LIBS 这个开关用来控制默认的库编译方式,如果不进行设置,使用ADD_LIBRARY并没有指定库类型的情况下,默认编译生成的都是静态库

    CMAKE_C_FLAGS  设置C编译选项,也可以通过指定ADD_DEFINITIONS()添加

    CMAKE_CXX_FLAGS 设置C++编译选项,也可以通过指令ADD_DEFINITIONS()添加

2:指令

    PROJECT :语法    PROJECT( projectname [CXX ]  [C]  [JAVA] ) 指定工程的名字以及工程支持的语言 , 默认情况下支持所有语言;

  SET :语法   SET(VAR  [VALUE]  [CACHE  TYPE  DOCSTRING [FORCE]])只需要了解SET指令可以用来显示的定义变量即可  例如:set(SRC_LIST main.c)

  MESSAGE: 语法  MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR]  "message to display")  这个指令用于向终端用户定义的信息  :

                SEND_ERROR:产生错误 ,生成过程被跳过

                 STATUS:输出前缀w为-的信息

                 FATAL_ERROR:立即终止所有cmake过程

   ADD_EXECUTABLE:ADD_EXECUTABLE( BINARY_NAME ${SRC_LIST} )    生成可执行文件    后跟源文件列表

   ADD_SUBDIRECTORY:   ADD_SUBDIRECTORY( source_dir  [binary_dir]  [EXCLUDE_FROM_ALL] ) 添加子目录,并可以指定中间二进制和目标二进制存放的位置,EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除

 INSTALL :用于定义安装规则,安装的内容可以包括目标二进制、动态库/静态库以及文件/目录/脚本等

        目标文件安装:  INSTALL (TARGETS targets ....)

                                                            [  [ARCHIVE|LIBRARY|RUNTIME] 

                                                                [DESTINATION  (dir)] 

                                                                 [PERMISSIONS  permissions]    [CONFIGURATIONS  [Debug|Release|...]] 

                                                                [COMPONENT <component>]            [OPTIONAL] ]   [ ..... ])

                    TARGETS 后面跟就是我们 通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,可能是可执行文件

/动态库/静态库

                  目标类型有三种:ARCHIVE 特指静态库,LIBRARY特指动态库  RUMTIME 特指可执行目标文件

                  DESTINATION:定义了安装路径,如果路径以/开头 ,那么指的是绝对路径,这个时候CMAKE_INSTALL_PREFIX其实就无效了,如果你希望使用CMAKE_INSTALL_PREFIX来定义安装 路径,就要写成相对路径,即不要以/开头 ,那末安装路径后的路径就是${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>   

                        例子:INSTALL (TARGETS myrun mylib  mystaticlib       

                                                           RUNTIME   DESTINATION    bin

                                                            LIBRARY  DESTINATION  lib

                                                             ARCHIVE  DESTINATION   libstatic)   

     INSTALL ( FILES files ... DESTINATION <dir>    [PERMISSIONS  permissions ...]   [CONFIGURATIONS   [Debug | Release |..]]     [COMPONENT  <component>]  [RENAME  <name>]  [OPTIONAL]   ) 可用于安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径,如果默认不定义PERMISSIONS,安装后的权限为OWNER_WRITE, OWNER_READ, GROUP_READ和WORLD_READ 即644权限

  安装时CMAKE脚本的执行

     INSTALL ([[SCRIPT <file>] [CODE <code>]] [...])

        SCRIPT 参数用于在安装时调用cmake脚本文件( 也就是<abc>.cmake )

        CODE 参数用于执行CMAKE指令,必须以双引号括起来,比如:INSTALL (CODE  "MESSAGE(\"Sample install message.\")")

  

ADD_LIBRARY  :  语法  ADD_LIBRARY( libname   [SHARED|STATIC|MODULE]  [EXCLUDE_REOM_ALL]  libsrc_list)

SET_TARGET_PROPERTIES:语法     SET_TARGET_PROPERIES( target1  target2 ....  PROPERTIES prop1 value1  prop2 values ... )

INCLUDE_DIRECTORIES:语法  INCLUDE_DIRECTORIES([AFTER|BEFORE]  [SYSTEM] dir1 dir2 ...) 向工程添加多个特定的头文件搜索路径,路径之间用空格分割  默认的行为是追加到当前的头文件搜索路径的后面,可以通过两种方式来进行控制搜索路径添加的方式:

              a:CMAKE_INCLUDE_DIRECTORIES_BEFORE 通过SET这个cmake变量为on,可以将添加的头文件搜索路径放在已有路径的前面

             b:通过AFTER 或者BEFORE参数,也可以控制是追加还是置前

LINK_DIRECTORIES:语法   LINK_DIRECTORIES( directory1  directory2 ... ) 添加非标准的共享库搜索路径

TARGET_LINK_LIBRARIES : 语法   TARGET_LINK_LIBRARIES( TARGET library1 <debug|optimized> library2    ... ) 这个指令可以用来为target 添加需要链接的共享库,同样也可以用于为自己编写的共享库添加共享库链接

FIND_PATH:语法  FIND_PATH(myHeader  NAMES hello.h  PATHS  /usr/include  /usr/include/hello)

ADD_DEFINITIONS: 向C/C++编译其添加-D定义,   定义预编译宏

ADD_DEPENDENCIES :语法 ADD_DEPENDENCIES(target-name  depend-target1 depend-target2 ....)

ADD_TEST 与ENABLE_TESTING指令: ENABLE_TESTING指令用来控制Makefile是否构建test目标,涉及工程所有目录 。一般情这个指令放在工程 的主CMakeLists.txt中        ADD_TEST( testname  Exename arg1 arg2 ... )  如果没有在同一个 CMakeLists.txt中打开ENABLE_TESTING()指令,任何ADD_TEST都是无效的

AUX_SOURCE_DIRECTORY :语法 AUX_SOURCE_DIRECTORY( dir   VARIABLE ) 作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动创建源文件列表。因为目前cmake还不能自动发现新添加的源文件

EXEC_PROGRAM( Executable  [directory in which to run]   [ARGS <argument to executable>]   [OUTPUT_VARIABLE <var> ]  [RETURN_VALUE  <var>]) 用于在指定的目录运行某个程序,通过ARGS添加参数,如果需要获取输出和返回值,可以通过OUTPUT_VARIABLE和RETURN_VALUE分别定义两个变量

FIND_系列指令主要包含 以下指令:  FIND_FILE(找文件)   FIND_LIBRARY:找库   FIND_PATH:找文件路径  FIND_PROGRAM:可执行程序的全路径   语法:FIND_XXX( <VAR>   name1  path1 path2 ) 结果放在VAR变量中

 

 控制指令:

     1: IF 指令,基本语法为:

                               IF(expression)

                                       #then section

                                        COMMAND1( ARGS ... )

                                        COMMAND2( ARGS ... )

                               ELSE(  expression )

                                          COMMAND1( ARGS ... )

                                          COMMAND2(ARGS ...)

                               ENDIF(expression)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值