cmake笔记

3 篇文章 0 订阅

1.变量

设置变量:set(SRC_DIR ./src)
引用变量:${SRC_DIR}
设置系统的环境变量: SET(ENV{变量名} 值)
引用系统的环境变量: $ENV{NAME}

2.常用预定义变量

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(src bin)可以更改此变量的值
    SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置
PROJECT_NAME 返回通过PROJECT指令定义的项目名称
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式

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

BUILD_SHARED_LIBS 控制默认的库编译方式。如果未进行设置,
    使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库
CMAKE_C_FLAGS 设置C编译选项,可用ADD_DEFINITIONS()
CMAKE_CXX_FLAGS 设置C++编译选项,可用ADD_DEFINITIONS()

3.常用命令

  • PROJECT

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

指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言

  • SET

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

定义变量(可以定义多个VALUE,如SET(SRC_LIST main.c util.c reactor.c))

  • MESSAGE

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)

向终端输出用户定义的信息或变量的值

SEND_ERROR, 产生错误,生成过程被跳过
STATUS, 输出前缀为—的信息
FATAL_ERROR, 立即终止所有cmake过程
  • ADD_EXECUTABLE

ADD_EXECUTABLE(bin_file_name ${SRC_LIST})

生成可执行文件

  • ADD_LIBRARY

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

CMAKE_MINIMUM_REQUIRED(VERSION version_number [FATAL_ERROR])

声明CMake的版本要求

  • ADD_SUBDIRECTORY

ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL])

向当前工程添加存放源文件的子目录,
并可以指定中间二进制和目标二进制的存放位置

EXCLUDE_FROM_ALL含义:将这个目录从编译过程中排除
  • INCLUDE_DIRECTORIES

INCLUDE_DIRECTORIES([AFTER | BEFORE] [SYSTEM] dir1 dir2 … )

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

  • LINK_DIRECTORIES

    LINK_DIRECTORIES(dir1 dir2 …)

添加非标准的共享库搜索路径

  • TARGET_LINK_LIBRARIES

TARGET_LINK_LIBRARIES(target lib1 lib2 …)

为target添加需要链接的共享库

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

ADD_DEPENDENCIES(target-name depend-target1 depend-target2 …)

定义target依赖的其他target,确保target在构建之前,其依赖的target已经构建完毕

  • AUX_SOURCE_DIRECTORY

AUX_SOURCE_DIRECTORY(dir VAR)

发现一个目录下所有的源代码文件并将列表存储在一个变量中
把当前目录下的所有源码文件名赋给变量DIR_HELLO_SRCS

  • EXEC_PROGRAM

EXEC_PROGRAM(Executable [dir where to run] [ARGS ][OUTPUT_VARIABLE ] [RETURN_VALUE ])

用于在指定目录运行某个程序(默认为当前CMakeLists.txt所在目录),通过ARGS添加参数,通过OUTPUT_VARIABLE和RETURN_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

INCLUDE(file [OPTIONAL]) 用来载入CMakeLists.txt文件

INCLUDE(module [OPTIONAL])用来载入预定义的cmake模块

  • OPTIONAL参数的左右是文件不存在也不会产生错误

可以载入一个文件,也可以载入预定义模块(模块会在CMAKE_MODULE_PATH指定的路径进行搜索)
载入的内容将在处理到INCLUDE语句时直接执行

  • FIND_

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

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

    FIND_LIBRARY(libX X11 /usr/lib)
    IF (NOT libx)
    MESSAGE(FATAL_ERROR "libX not found")
    ENDIF(NOT libX)
    

    FIND_PATH( name path1 path2 …)
    VAR变量代表包含这个文件的路径

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

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

4.引用一个qt的cmake示例

CMakeLists.txt

# 需用使用的最小的CMake版本
cmake_minimum_required(VERSION 3.7)
# 本次构建的可执行文件名称
set(TARGET_NAME QtDemo)
# 本次使用C++标准版本
set(CMAKE_CXX_STANDARD 17)
# 字面意思,包含当前目录,可以方便开发
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 开启Qt代码自动生成,不再需用自己手写了。按顺序,分别是`Q_OBJECT`宏展开,资源文件,界面文件。
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# 简单粗暴的把源码搜集起来。按顺序,分别是实现文件,头文件,界面文件,资源文件
file(GLOB_RECURSE SOURCES "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE FORMS "*.ui")
file(GLOB_RECURSE RESOURCES "*.qrc")
# 使用第三方库需要用到的一个包
find_package(PkgConfig REQUIRED)
# 使用Qt的模块,写法和.pro文件类似
set(QT Core Gui Widgets Network DBus Sql)
find_package(Qt5 REQUIRED ${QT})
# 使用的第三方模块
pkg_check_modules(3rd_lib REQUIRED
        dtkwidget dframeworkdbus
        )
# 生成程序
add_executable(${TARGET_NAME} ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})
target_include_directories(${TARGET_NAME} PUBLIC ${3rd_lib_INCLUDE_DIRS} )
target_link_libraries(${TARGET_NAME} ${3rd_lib_LIBRARIES} )
# 在CMake中使用Qt最快捷的方式,一句代码搞定
qt5_use_modules(${TARGET_NAME} ${QT})
# 字面意思,安装文件的前缀
set(CMAKE_INSTALL_PREFIX /usr)
# 安装可执行文件
install(TARGETS ${TARGET_NAME} DESTINATION bin)
# 设置程序为窗口,而不是控制台
Set_Target_Properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")

参考:

  1. my coding.net
  2. cmake使用示例与整理总结
  3. CMake构建Qt
  4. 用CMake屏蔽Release运行时的控制台窗口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baibingql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值