CMake学习记录

参考文章:CMake Practice

文章目录

  • PROJECT
  • SET
  • MESSAGE
  • ADD_EXECUTABLE
  • 变量
  • ADD_SUBDIRECTORY
  • LIBRARY_OUTPUT_PATH/EXECUTABLE_OUTPUT_PATH
  • INSTALL
    • 安装普通文件
    • 非目标文件的可执行程序安装(脚本)
    • 目录安装
    • CMAKE脚本执行
  • 静态库与动态库
    • SET_TARGET_PROPERTIES
    • GET_TARGET_PROPERTIE
  • 使用外部共享库
  • CMAKE常用变量和使用环境变量
    • CMAKE_BINARY_DIR/PROJECT_BINARY_DIR/_BINARY_DIR
    • CMAKE_SOURCE_DIR/PROJECT_SOURCE_DIR/_SOURCE_DIR
    • CMAKE_CURRENT_SOURCE_DIR
    • CMAKE_CURRENT_BINARY_DIR
    • CMAKE_CURRENT_LIST_FILE
    • CMAKE_CURRENT_LIST_LINE
    • CAMKE_MODULE_PATH
    • LIBRARY_OUTPUT_PATH/EXECUTABLE_OUTPUT_PATH
    • PROJECT_NAME
  • cmake调用环境变量
    • CMAKE_INCLUDE_CURRENT_DIR
    • CMAKE_INCLUDE_DIRECTORIES_BEFORE
    • 系统信息
    • 开关选项
  • cmake常用指令
    • ADD_DEFINITIONS
    • ADD_DEPEDENCIES
    • ADD_EXECUTABLE、ADD_LIBRARY、ADD_SUBDIRECTORY
    • ADD_TEST与ENABLE_TESTING指令
    • AUX_SOURCE_DIRECTORY
    • CMAKE_MINIMUM_REQUIRED
    • EXEC_PROGRAM
    • FILE
    • INCLUDE
    • INSTALL
    • FIND_指令
      • FIND_FILE
      • FIND_LIBRARY
      • FIND_PATH
      • FIND_PROGRAM
      • FIND_PACKAGE
  • 控制指令
    • IF
      • 表达式(expression)的使用方法
    • WHILE
    • FOREACH
      • 列表
      • 范围
      • 范围和步进
  • Cmake交叉编译

PROJECT

PROJECT(projectname [CXX] [C] [JAVA])

PROJECT用于定义工程名称,该指令隐式的定义了两个cmake变量:_BINARY_DIR、_source_DIR

cmake预定义PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR与上面两个cmake变量一致

SET

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

用于定义变量

SET(SRC_LIST main.c t1.c t2.c)

MESSAGE

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display")
类型 含义
SEND_ERROR 产生错误,生成过程被跳过
STATUS 输出前缀为–的信息
FATAL_ERROR 立即终止所有cmake过程

ADD_EXECUTABLE

ADD_EXECUTABLE(hello ${SRC_LSIT})

生成一个文件名为hello的可执行文件,相关源文件是SRC_LIST中定义的源文件列表

变量

使用${}应用变量,是cmake应用变量的方式

在cmake中使用IF控制语句,变量是直接使用变量名引用不许要 。 若 使 用 {}。若使用 使{}去应用变量,IF判断的是${}所代表的值得变量,必定不存在

  1. 使用${}方式取值,在IF控制语句中直接使用变量名
  2. 指令(参数1 参数2)
  3. 指令大小写无关,参数和变量大小写相关。推荐指令使用大写指令

ADD_SUBDIRECTORY

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

该指令用于向当前工程添加存放源文件的子目录,并可以将制定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL参数含义是将这个目录从编译过程中排除,比如example,可能需要工程构建完成之后,在进入example目录单独进行构建

ADD_SUBDIRECTORY

ADD_SUBDIRECTORY(src bin)

将src子目录加入工程,并制定编译输出(包含编译中间结果)路径为bin目录。如果bin目录不指定编译结果将放在build/src目录,指定bin目录之后,相当于在编译时将src重命名为bin,所有中间结果和目标二进制都将存放在bin目录

LIBRARY_OUTPUT_PATH/EXECUTABLE_OUTPUT_PATH

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

EXECUTABLE_OUTPUT_PATH->二进制文件输出目录
LIBRARY_OUTPUT_PATH->库文件输出目录
可以通过SET重新定义

这两条志林卸载build目录下的CMakeList.txt还是build/src目录下CMakeList.txt,写在src目录下,原则是在哪里ADD_EXECUTABLE或者ADD_LIBRARY,需要改变目标存放路径,就在哪里加入上述定义

INSTALL

INSTALL(TARGET targets...
        [[ARCHIVE|LIBRARY|RUNTIME]
                    [DESTINATION ]
                    [PERMISSIONS permissions...]
                    [CONFIGURATIONS
                            [DEBUG|RELEASE|...]]
                    [COMPONENT ]
                    [OPTIONAL]
                    ] [...])

参数中的TARGETS后面跟的是通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,可以是可执行二进制、动态库、静态库

目标类型也有对应的三种

类型 含义
ARCHIVE 静态库
LIBRARY 动态库
RUNTIME 可执行目标二进制

DESTINATION指定了安装的路径,如果路径以/开头,指的是绝对路径,这时候CMAKE_INSTALL_PREFIX其实无效了。
希望使用CMAKE_INSTALL_PREFIX定义安装路径就要写成相对路径,即不要以/开头安装后的路径是
CMAKE_INSTALL_PREFIX/

示例

INSTALL(TARGETS myrun mylib mystaticlib...
        ARCHIVE DESTINATION libstatic
        LIBRARY DESTINATION lib
        RUNTIME DESTINATION bin

安装普通文件

INSTALL(FILES files... DESTINATION 
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT ]
        [RENAME ]
        [OPTIONAL])

用于安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径。如果默认不定权限PERMISSIONS,安装后的权限为:
OWNER_WRITE、OWNER_READ、GROUP_READ和WORLD_READ,即644权限

非目标文件的可执行程序安装(脚本)

INSTALL(PROGRAMS files... DESTINATION 
      

你可能感兴趣的:(C/C++,CMake)