• 【cmake实战八】cmake 常用变量


    一、cmake 自定义变量的方式:

    • 隐式定义
      就是 PROJECT 指令,他 会隐式的定义_BINARY_DIR 和_SOURCE_DIR 两个变 量。
    • 显式定义,
      使用 SET 指令
    • 例子,如下
    CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
    
    SET(TARGET "HELLO")
    PROJECT(${TARGET})
    
    message(STATUS "source dir is :" ${HELLO_SOURCE_DIR}) 
    #大家用的最多的并非<projectname>_BINARY_DIR,而是PROJECT_BINARY_DIR
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    二、cmake 变量引用的方式

    • ${}进行变量的引用
    • 例子,如上图

    三、cmake 常用变量

    1、PROJECT_BINARY_DIR

    • 同CMAKE_BINARY_DIR、 _BINARY_DIR这三个变量指代的内容是一致的,
    • 如果是 in source 编译,指得就是工程顶层目录,
    • 如果 是 out-of-source 编译,指的是工程编译发生的目录。

    2、PROJECT_SOURCE_DIR

    • 同CMAKE_SOURCE_DIR、_SOURCE_DIR这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。

    3、CMAKE_CURRENT_SOURCE_DIR

    指的是当前处理的 CMakeLists.txt 所在的路径,比如之前我们提到的 src 子目录。

    4、CMAKE_CURRRENT_BINARY_DIR

    • 如果是 in-source 编译,它跟CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-source 编译,他指的是 target 编译目录。

    5、CMAKE_CURRENT_LIST_FILE

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

    6、CMAKE_CURRENT_LIST_LINE

    • 输出这个变量所在的行

    7、CMAKE_MODULE_PATH

    • 这个变量用来定义自己的 cmake 模块所在的路径。
    • 如果你的工程比较复杂,有可能会自己 编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设 置一下。 比如SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

    8、EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH

    • 分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。

    9、PROJECT_NAME

    • 返回通过 PROJECT 指令定义的项目名称。

    四、cmake 调用环境变量的方式

    • 使用 $ENV{NAME} 指令就可以调用系统的环境变量了。
    • 设置环境变量的方式是:
      SET(ENV{变量名} 值)
    • 例子如下
    CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
    
    SET(TARGET "HELLO")
    PROJECT(${TARGET})
    
    message(STATUS "source dir is :" ${HELLO_SOURCE_DIR}) 
    #大家用的最多的并非<projectname>_BINARY_DIR,而是PROJECT_BINARY_DIR
    
    MESSAGE(STATUS "the system path:" $ENV{PATH})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 输出为

    在这里插入图片描述

    五、系统信息

    • 1,CMAKE_MAJOR_VERSION,CMAKE 主版本号,
      比如 2.4.6 中的 2
    • 2,CMAKE_MINOR_VERSION,CMAKE 次版本号
      比如 2.4.6 中的 4
    • 3,CMAKE_PATCH_VERSION,CMAKE 补丁等级,
      比如 2.4.6 中的 6
    • 4,CMAKE_SYSTEM,系统名称,
      比如 Linux-2.6.22
    • 5,CMAKE_SYSTEM_NAME,不包含版本的系统名,
      比如 Linux
    • 6,CMAKE_SYSTEM_VERSION,系统版本,
      比如 2.6.22
    • 7,CMAKE_SYSTEM_PROCESSOR,处理器名称,
      比如 i686.
    • 8,UNIX,在所有的类 UNIX 平台为 TRUE,
      包括 OS X 和 cygwin
    • 9,WIN32,在所有的 win32 平台为 TRUE,
      包括 cygwin

    例子

    CMAKE_MINIMUM_REQUIRED(VERSION 3.8.0)
    
    SET(TARGET "HELLO")
    PROJECT(${TARGET})
    
    message(STATUS "source dir is :" ${HELLO_SOURCE_DIR}) 
    #大家用的最多的并非<projectname>_BINARY_DIR,而是PROJECT_BINARY_DIR
    
    #MESSAGE(STATUS "the system path:" $ENV{PATH})
    
    MESSAGE(STATUS "CMAKE_MAJOR_VERSION:" ${CMAKE_MAJOR_VERSION})
    MESSAGE(STATUS "CMAKE_MINOR_VERSION:" ${CMAKE_MINOR_VERSION})
    MESSAGE(STATUS "CMAKE_PATCH_VERSION:" ${CMAKE_PATCH_VERSION})
    MESSAGE(STATUS "CMAKE_SYSTEM:" ${CMAKE_SYSTEM})
    MESSAGE(STATUS "CMAKE_SYSTEM_NAME:" ${CMAKE_SYSTEM_NAME})
    MESSAGE(STATUS "CMAKE_SYSTEM_VERSION:" ${CMAKE_SYSTEM_VERSION})
    MESSAGE(STATUS "CMAKE_SYSTEM_PROCESSOR:" ${CMAKE_SYSTEM_PROCESSOR})
    MESSAGE(STATUS "UNIX:" ${UNIX})
    MESSAGE(STATUS "WIN32:" ${WIN32})
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    输出如下

    在这里插入图片描述

    六,主要的开关选项:

    • 1,CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS,
      用来控制 IF ELSE 语句的书写方式,
    if(WIN32)
        message(STATUS "This is windows.")
    else(WIN32)
        message(STATUS "This is not windows.")
    endif(WIN32)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在增加了

    set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
    
    • 1

    便可以写为

    if(WIN32)
        message(STATUS "This is windows.")
    else()
        message(STATUS "This is not windows.")
    endif()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 2,BUILD_SHARED_LIBS
      这个开关用来控制默认的库编译方式,如果不进行设置,使用 ADD_LIBRARY 并没有指定库 类型的情况下,默认编译生成的库都是静态库。 如果 SET(BUILD_SHARED_LIBS ON)后,默认生成的为动态库。

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

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

  • 相关阅读:
    Debezium系列之:Debezium技术专栏第300篇系列文章之打通Debezium实时采集Oracle数据库数据到Kafka集群的技术
    Git--原理与使用
    uniapp实现表格冻结
    使用jQuery的extend方法扩展window自定义对象
    vue2配置环境变量并且nginx运行成功
    Java 中的线程池
    应急响应-分析(windows)
    2023 ~【VUE+Xterm+Websocket】模拟SSH连接效果
    lc回溯1
    软文如何打动用户,媒介盒子教你几招
  • 原文地址:https://blog.csdn.net/junxuezheng/article/details/126755856