01 cmake参考手册

cmake使用手册

(V1)

1、cmake 查阅

cmake --help-module-list | findstr -i bz

2、项目目录相关

# 构建发生的目录
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR

# 不论采用何种编译方式,都是工程顶层目录
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR

PROJECT_NAME              # 返回通过PROJECT指令定义的项目名称

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

CMAKE_CURRENT_BINARY_DIR  # 内部编译: 跟CMAKE_CURRENT_SOURCE_DIR一致
                          # 外部编译: 指的是构建目录
                          # add_subdirectory(src bin) 会更改它的值为 bin

CMAKE_CURRENT_LIST_FILE   # 当前输出所在的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE   # 当前输出所在的行

CMAKE_MODULE_PATH         # 模块所在路径
                          # SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块

EXECUTABLE_OUTPUT_PATH    # 可执行文件存放目录
LIBRARY_OUTPUT_PATH       # 库存放目录

CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE # 将工程提供的头文件目录始终置于系统头文件目录的前面

CMAKE_INCLUDE_PATH        # 头文件搜索目录

CMAKE_LIBRARY_PATH        # 库搜索目录

3、系统信息

CMAKE_MAJOR_VERSION       # CMAKE主版本号,比如2.4.6中的2
CMAKE_MINOR_VERSION       # CMAKE次版本号,比如2.4.6中的4
CMAKE_PATCH_VERSION       # CMAKE补丁等级,比如2.4.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,包括OSX和cygwin
WIN32                     # 在所有的Win32平台为TRUE,包括cygwin

4、开关选项

CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS   # 用来控制IF ELSE语句的书写方式
BUILD_SHARED_LIBS         # 这个开关用来控制默认的库编译方式: 动态库 静态库
                          # 如果ADD_LIBRARY时没有指定库类型,那么默认编译生成的库都是静态库
                          
CMAKE_C_FLAGS             # 设置C编译选项
CMAKE_CXX_FLAGS           # 设置C++编译选项
CMAKE_INCLUDE_CURRENT_DIR # 自动将每个CMakeLists.txt的所在目录依次加入到 头文件搜索目录

5、编译参数

message(STATUS "CMAKE_C_FLAGS = " ${CMAKE_C_FLAGS})
message(STATUS "CMAKE_C_FLAGS_DEBUG = " ${CMAKE_C_FLAGS_DEBUG})
message(STATUS "CMAKE_C_FLAGS_RELEASE = " ${CMAKE_C_FLAGS_RELEASE})

message(STATUS "CMAKE_CXX_FLAGS = " ${CMAKE_CXX_FLAGS})
message(STATUS "CMAKE_CXX_FLAGS_DEBUG = " ${CMAKE_CXX_FLAGS_DEBUG})
message(STATUS "CMAKE_CXX_FLAGS_RELEASE = " ${CMAKE_CXX_FLAGS_RELEASE})

message(STATUS "CMAKE_EXE_LINKER_FLAGS = " ${CMAKE_EXE_LINKER_FLAGS})
message(STATUS "CMAKE_EXE_LINKER_FLAGS_DEBUG = " ${CMAKE_EXE_LINKER_FLAGS_DEBUG})
message(STATUS "CMAKE_EXE_LINKER_FLAGS_RELEASE = " ${CMAKE_EXE_LINKER_FLAGS_RELEASE})

message(STATUS "CMAKE_SHARED_LINKER_FLAGS = " ${CMAKE_SHARED_LINKER_FLAGS})
message(STATUS "CMAKE_SHARED_LINKER_FLAGS_DEBUG = " ${CMAKE_SHARED_LINKER_FLAGS_DEBUG})
message(STATUS "CMAKE_SHARED_LINKER_FLAGS_RELEASE = " ${CMAKE_SHARED_LINKER_FLAGS_RELEASE})

message(STATUS "CMAKE_STATIC_LINKER_FLAGS = " ${CMAKE_STATIC_LINKER_FLAGS})
message(STATUS "CMAKE_STATIC_LINKER_FLAGS_DEBUG = " ${CMAKE_STATIC_LINKER_FLAGS_DEBUG})
message(STATUS "CMAKE_STATIC_LINKER_FLAGS_RELEASE = " ${CMAKE_STATIC_LINKER_FLAGS_RELEASE})

6、指令参考

1)cmake变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
2) 环境变量使用$ENV{}方式取值,使用SET(ENV{VAR} VALUE)赋值
3)指令( 参数1 参数2 … )
 参数使用括弧括起,参数之间使用空格或分号分开。
 指令是大小写无关的,参数和变量是大小写相关的。推荐你全部使用大写指令。

  • PROJECT(projectname [CXX] [C] [Java])
    指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言

  • SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
    定义变量(可以定义多个VALUE,如SET(SRC_LIST main.c util.c reactor.c)

  • MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" …)
    向终端输出用户定义的信息或变量的值
    SEND_ERROR: 产生错误,生成过程被跳过
    STATUS: 输出前缀为-的信息
    FATAL_ERROR: 立即终止所有cmake过程

  • ADD_EXECUTABLE(bin_file_name ${SRC_LIST})
    生成可执行文件

  • ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST)
    生成动态库或静态库
    SHARED 动态库
    STATIC 静态库
    MODULE 在使用dyld的系统有效,若不支持dyld,等同于SHARED
    EXCLUDE_FROM_ALL 表示该库不会被默认构建

  • SET_TARGET_PROPERTIES
    设置输出的名称,设置动态库的版本和API版本

  • CMAKE_MINIMUM_REQUIRED(VERSION version_number [FATAL_ERROR])
    声明CMake的版本要求

  • ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
    向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置
    EXCLUDE_FROM_ALL含义:将这个目录从编译过程中排除

  • SUBDIRS
    deprecated,不再推荐使用
    SUBDIRS(hello sample)相当于分别写ADD_SUBDIRECTORY(hello),ADD_SUBDIRECTORY(sample)

  • INCLUDE_DIRECTORIES([AFTER | BEFORE] [SYSTEM] dir1 dir2 … )
    向工程添加多个特定的头文件搜索路径,路径之间用空格分隔如果路径包含空格,可以使用双引号将它括起来,默认的行为为追加到当前头文件搜索路径的后面。
    有如下两种方式可以控制搜索路径添加的位置:
    CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过SET这个cmake变量为on,可以将添加的头文件搜索路径放在已有路径的前面,通过AFTERBEFORE参数,也可以控制是追加还是置前。

  • LINK_DIRECTORIES(dir1 dir2 …)
    添加非标准的共享库搜索路径

  • LINK_LIBRARIES(library1 <debug|optimized> library2 ...)
    用在add_executable之前,用来链接静态库

  • TARGET_LINK_LIBRARIES(target lib1 lib2 …)
    用在add_executable之后,用来链接动态库

  • ADD_DEFINITIONS
    向C/C++编译器添加-D定义
    ADD_DEFINITIONS(-DENABLE_DEBUG -DABC)参数之间用空格分隔

  • ADD_DEPENDENCIES(target-name depend-target1 depend-target2 …)
    定义target依赖的其他target,确保target在构建之前,其依赖的target已经构建完毕

  • AUX_SOURCE_DIRECTORY(dir VAR)
    发现一个目录下所有的源代码文件并将列表存储在一个变量中

  • EXEC_PROGRAM(Executable [dir where to run] [ARGS <args>][OUTPUT_VARIABLE <var>] [RETURN_VALUE <value>])
    用于在指定目录运行某个程序(默认为当前CMakeLists.txt所在目录),通过ARGS添加参数,通过OUTPUT_VARIABLERETURN_VALUE获取输出和返回值,如下示例:

 # 在src中运行ls命令,在src/CMakeLists.txt添加
 EXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
 IF (not LS_RVALUE)
    MESSAGE(STATUS "ls result: " ${LS_OUTPUT}) # 缩进仅为美观,语法无要求
 ENDIF(not LS_RVALUE)
  • INCLUDE(file [OPTIONAL]) 用来载入CMakeLists.txt文件

  • INCLUDE(module [OPTIONAL])用来载入预定义的cmake模块
    文件不存在也不会产生错误
    可以载入一个文件,也可以载入预定义模块(模块会在CMAKE_MODULE_PATH指定的路径进行搜索)
    载入的内容将在处理到INCLUDE语句时直接执行

  • FIND_FILE(<VAR> name path1 path2 …)
    VAR变量代表找到的文件全路径,包含文件名

  • FIND_LIBRARY(<VAR> name path1 path2 …)
    VAR变量代表找到的库全路径,包含库文件名
    案例:

 FIND_LIBRARY(libX X11 /usr/lib)
 IF (NOT libx)
    MESSAGE(FATAL_ERROR "libX not found")
 ENDIF(NOT libX)
  • FIND_PATH(<VAR> name path1 path2 …)
    VAR变量代表包含这个文件的路径

  • FIND_PROGRAM(<VAR> name path1 path2 …)
    VAR变量代表包含这个程序的全路径

  • FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE] [[REQUIRED | COMPONENTS] [componets …]])
    用来调用预定义在CMAKE_MODULE_PATH下Find<name>.cmake模块,你也可以自己定义Find<name>
    模块,通过SET(CMAKE_MODULE_PATH dir)将其放入工程的某个目录供工程使用

5.3 IF
语法:

IF (expression)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ELSE (expression)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDIF (expression) # 一定要有ENDIF与IF对应

7、控制流结构

IF

1)常规用法

IF (expression), expression不为:空,0,N,NO,OFF,FALSE,NOTFOUND或<var>_NOTFOUND,为真
IF (not exp), 与上面相反
IF (var1 AND var2)
IF (var1 OR var2)
IF (COMMAND cmd) 如果cmd确实是命令并可调用,为真
IF (EXISTS dir) IF (EXISTS file) 如果目录或文件存在,为真
IF (file1 IS_NEWER_THAN file2),当file1比file2新,或file1/file2中有一个不存在时为真,文件名需使用全路径
IF (IS_DIRECTORY dir) 当dir是目录时,为真
IF (DEFINED var) 如果变量被定义,为真
IF (var MATCHES regex) 此处var可以用var名,也可以用${var}
IF (string MATCHES regex)

2)表达式是数字类型

IF (variable LESS number)
IF (string LESS number)
IF (variable GREATER number)
IF (string GREATER number)
IF (variable EQUAL number)
IF (string EQUAL number)

3)表达式是字母

IF (variable STRLESS string)
IF (string STRLESS string)
IF (variable STRGREATER string)
IF (string STRGREATER string)
IF (variable STREQUAL string)
IF (string STREQUAL string)

Notice…Get a Surprise:SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

WHILE

语法

WHILE(condition)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDWHILE(condition)

FOREACH

语法1:常规表示法

FOREACH(loop_var arg1 arg2 ...)
     COMMAND1(ARGS ...)
     COMMAND2(ARGS ...)
 ...
ENDFOREACH(loop_var)

案例:

FOREACH(loop_var ${SRC_LIST})
  MESSAGE(${loop_var})
ENDFOREACH(loop_var)

语法2:范围

FOREACH(loop_var RANGE total)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDFOREACH(loop_var)

案例:

FOREACH(var RANGE 10)
  MESSAGE(${var})
ENDFOREACH(var)

语法3:范围和步长

FOREACH(loop_var RANGE start stop [step])
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDFOREACH(loop_var)

例:

FOREACH(var RANGE 5 15 3)
  MESSAGE(${var})
ENDFOREACH(var)

macro

macro( [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endmacro()

function

function(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endfunction(<name>)
变量名意义
ARGC参数个数
ARGV参数列表
ARGV0参数0
ARGV1参数1
ARGV2参数2
ARGN超出最后一个预期参数的参数列表

list

list(LENGTH <list> <output variable>) //获得list长度
list(GET <list> <element index> [<element index> ...]
     <output variable>) //获得list的某个位置元素
list(APPEND <list> [<element> ...])//add
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)//清理
list(FIND <list> <value> <output variable>) //查找
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

综合示例:

function(Foo arg)
    MESSAGE(STATUS "ARGV=${ARGV}")
    MESSAGE(STATUS "ARGC=${ARGC}")
    MESSAGE(STATUS "ARGV0=${ARGV0}")
    MESSAGE(STATUS "ARGV1=${ARGV1}")
    MESSAGE(STATUS "ARGV2=${ARGV2}")
    MESSAGE(STATUS "ARGN=${ARGN}")
    LIST(LENGTH ARGV argv_len)
    MESSAGE(STATUS "length of argv_len=${argv_len}")
    SET (i 0)
    WHILE (i LESS ${argv_len})
        LIST(GET ARGV ${i} argv_value)
        MESSAGE(STATUS "argv[${i}]=${argv_value}")
        MATH(EXPR i "${i} + 1")
    ENDWHILE()
endfunction()
Foo(arg0 arg1 arg2 arg3)

输出:
-- ARGV=arg0;arg1;arg2;arg3
-- ARGC=4
-- ARGV0=arg0
-- ARGV1=arg1
-- ARGV2=arg2
-- ARGN=arg1;arg2;arg3
-- length of argv_len=4
-- argv[0]=arg0
-- argv[1]=arg1
-- argv[2]=arg2
-- argv[3]=arg3
### 回答1: cmake参考手册_中文.pdf是一份关于CMake构建工具的官方文档,它包含了CMake的所有特性和用法,对于想要学习和使用CMake的开发者来说,是非常重要的参考材料。 该手册具体包含以下内容: 1. CMake的基本概念和理念,包括如何使用CMake构建和管理项目; 2. CMake的高级特性,包括环境管理、包管理和定制等; 3. CMake的语法和命令,包括常用命令的使用方法和参数解释; 4. CMake的模块和插件机制,包括如何使用、编写、分享和安装CMake模块和插件。 除了详细介绍CMake的特性和用法外,该手册还提供了丰富的示例代码和演示项目,供开发者参考和借鉴。同时,该手册也包含了一些常见问题和故障排除技巧,能够帮助开发者更加顺利地使用和调试CMake。 总之,CMake参考手册_中文.pdf是一份资深开发人员和学习者必备的参考材料,它可以帮助开发者更好地理解和掌握CMake构建工具的所有特性和用法,提高软件开发的效率和质量。 ### 回答2: "CMake参考手册_中文.pdf"是一本关于使用CMake构建和管理项目的中文参考手册。该手册介绍了CMake的基本概念和语法,以及如何使用CMake来配置、编译、测试和安装软件。 CMake是一个跨平台的构建工具,它的优点在于可以生成各种不同IDE所需要的项目文件,同时不依赖于任何特定的编译器或操作系统。通过CMake,用户可以使用相同的CMakeLists.txt文件来构建项目的不同版本,例如Debug或Release版本,或者不同架构的版本。 在该参考手册中,用户可以了解到如何使用CMakeLists.txt文件来定义源代码、依赖项、编译器选项等,并且可以了解到如何使用CMake来生成特定平台所需的编译文件,例如Makefile或Visual Studio项目文件。此外,手册还介绍了如何使用CMake来编写单元测试,并提供了一些常用的CMake命令和变量的注释说明以及示例代码。 总而言之,"CMake参考手册_中文.pdf"对于需要使用CMake来构建跨平台项目的开发者来说,是一份非常有价值的参考资料,可以快速入门并掌握CMake的使用方法。如果您需要使用CMake来管理您的项目,建议您下载该参考手册进行学习和参考。 ### 回答3: CMake参考手册是一个方便CMake用户查阅和学习的工具,能够帮助用户快速了解CMake的使用方法和相关知识。该参考手册是以PDF格式发布,可以在网上搜索到相应的下载链接。 其中,pan.baidu.com是一个常见的文件分享站点之一。用户只需在搜索框中输入“CMake参考手册_中文.pdf”,然后点击搜索,在搜索结果中找到符合要求的链接,就可以下载CMake参考手册了。下载完成后,用户可以将其保存在本地,随时查看使用,也可以打印成纸质版。 CMake是一个功能强大的跨平台构建工具,它使得软件开发者可以使用简洁的语法来编写构建文件,而不必关心底层的细节。CMake参考手册详细介绍了它的语法和使用方法,还提供了实用的示例和技巧,方便用户更好地掌握CMake的使用。如果你需要使用CMake来构建自己的项目,那么这个参考手册一定是你必不可少的工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值