CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。指令是大小写无关的,参数和变量是大小写相关的。但推荐全部使用大写指令。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

自己写了一个小例子,包含了静态库和动态库以及基本的依赖关系。

按照目录结构加入文件(筛选器)
#按目录结构加入文件
macro(create_filters source_files)if(MSVC)# 获取当前目录set(current_dir ${CMAKE_CURRENT_SOURCE_DIR})foreach(src_file ${${source_files}})# 求出相对路径string(REPLACE ${current_dir}/ "" rel_path_name ${src_file})# 删除相对路径中的文件名部分string(REGEX REPLACE "(.*)/.*" \\1 rel_path ${rel_path_name})# 比较是否是当前路径下的文件string(COMPARE EQUAL ${rel_path_name} ${rel_path} is_same_path)# 替换成Windows平台的路径分隔符string(REPLACE "/" "\\" rel_path ${rel_path})if(is_same_path)set(rel_path "\\")endif(is_same_path)# CMake 命令source_group(${rel_path} FILES ${src_file})endforeach(src_file)endif(MSVC)
endmacro(create_filters)#用法
#所有文件保存在一个变量中
file(GLOB_RECURSE all_files *.h *.cpp *.c *.cc)
create_filters(all_files)add_executable(MFCDemo${all_files}            )
根据debug和release自动区分表示debug和release文件夹
#debug版本$(Configuration)表示debug文件夹
link_directories(${PROJECTS_PATH}/out/$(Configuration))
将当前目录添加到环境变量中

可以用bat命令

setx ZYB_MEDIA_DIRECTORY %cd%

之后cmake中就可以用此变量作为当前目录路径

#变量ZYB_MEDIA_DIRECTORY表示上述bat文件所在目录
set(ZYB_MEDIA_DIRECTORY $ENV{ZYB_MEDIA_DIRECTORY})
构建成功后复制依赖的dll到指定目录
set(LIB_FILE ${ZYB_MEDIA_DIRECTORY}/third_party/ffmpeg/lib-x86)
#构建成功后复制依赖的dll
add_custom_command(TARGET PlayerTest POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avcodec-58.dll ${EXECUTABLE_OUTPUT_PATH}/$(CONFIGURATION)COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avfilter-7.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avformat-58.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avutil-56.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/postproc-55.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/swresample-3.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/swscale-5.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/SDL.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>)
设置宏定义
#宏定义
add_definitions(-D WEBRTC_WIN)
add_definitions(-D CURL_STATICLIB)
add_definitions(-D NOMINMAX)
MFC相关
# 1 在静态库中使用MFC,2共享方式使用mfc
set(CMAKE_MFC_FLAG 1)
#共享DLL中使用 MFC
#add_definitions(-D_AFXDLL)
#UNICODE字符集
add_definitions(-DUNICODE -D_UNICODE)
#子系统窗口
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS")
Qt相关
cmake_minimum_required(VERSION 3.2.0)
project(QtDemo)#设置工程包含当前目录,非必须
set(CMAKE_INCLUDE_CURRENT_DIR ON)#打开全局moc,设置自动生成moc文件,一定要设置
set(CMAKE_AUTOMOC ON)
#打开全局uic,非必须
set(CMAKE_AUTOUIC ON)
#打开全局rcc,非必须,如需打开,注意修改33行的qrc文件名
#set(CMAKE_AUTORCC ON)#查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加
find_package(Qt5Widgets)
find_package(Qt5Core)
find_package(Qt5Gui)
find_package(Qt5Network)include_directories(${PROJECTS_PATH}/../src)
include_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/handler)
include_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/handler/third_party/breakpad/src)link_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/lib/$(Configuration))
link_directories(${PROJECTS_PATH}/out/$(Configuration))#查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量
#查找设置当前文件夹中所有的ui文件
FILE(GLOB UI_FILES "./*.ui")file(GLOB_RECURSE all_files *.h *.cpp *.c *.cc LY_Utils/*.*)
create_filters(all_files)#通过Ui文件生成对应的头文件,一定要添加
qt5_wrap_ui(WRAP_FILES ${UI_FILES})#添加资源文件,非必须,一旦采用,注意修改相应的qrc文件名
#set(RCC_FILES QtDemo.qrc)#将ui文件和生成文件整理在一个文件夹中,非必须
#source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )SET(EXECUTABLE_OUTPUT_PATH ../out)#创建工程文件
add_executable(QtDemo ${all_files} ${WRAP_FILES})#添加Qt5依赖项
target_link_libraries(QtDemo Qt5::Widgets Qt5::Core Qt5::Gui Qt5::Network)
cmake中一些预定义变量

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语句的书写方式

设置输出目录

一. SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin)

上面的语句能设置可执行文件的输出目录

在Win + VS环境下,会自动在你所设置的目录后面扩展一层 目录,所以最终生成的Debug版本程序会在 ${PROJECT_SOURCE_DIR}/../bin/Debug 目录下,Release版本程序会在 ${PROJECT_SOURCE_DIR}/../bin/Release 目录下.

在Linux + GCC环境下,无论是Debug还是Release,生成的可执行程序会直接放在你所设置的目录下,不会有差异.

二. SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib)

上面的语句能设置库文件的输出目录

在Win + VS环境下,会自动在你所设置的目录后面扩展一层 目录,所以最终生成的Debug版本库会在 ${PROJECT_SOURCE_DIR}/../lib/Debug 目录下,Release版本库会在 ${PROJECT_SOURCE_DIR}/../lib/Release 目录下.

在Linux + GCC环境下,无论是Debug还是Release,生成的库文件会直接放在你所设置的目录下,不会有差异.

三. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../bin)

上面两条语句分别设置了Debug版本和Release版本可执行文件的输出目录,

一旦设置上面的属性,在任何环境下生成的可执行文件都将直接放在你所设置的目录.

四. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../lib)

上面两条语句分别设置了Debug版本和Release版本库文件的输出目录,

一旦设置上面的属性,在任何环境下生成的库文件都将直接放在你所设置的目录.

五. set(CMAKE_DEBUG_POSTFIX "_d") set(CMAKE_RELEASE_POSTFIX "_r")

上面两条语句分别设置了Debug版本和Release版本下库文件的后缀名.

六. set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d") set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r")

上面两条语句分别设置了Debug版本和Release版本下可执行文件的后缀名.

更多参考:

cmake使用示例与整理总结
CMake 设置Target输出目录和后缀名
cmake 简介
CMake命令:CMake构建系统的骨架
CMake: 将文件从源目录复制到二进制目录_cmake_帮酷编程知识库
CMake经验
cmake设置mfc编译项目
用 cmake 构建Qt工程(对比qmake进行学习)
基于Cmake+QT+VS的C++项目构建开发编译简明教程
cmake使用笔记

转载于:https://www.cnblogs.com/ZY-Dream/p/11232779.html

cmake用法及常用命令总结(全)相关推荐

  1. lisp调用qleader端点_CAD常用命令大全全解.doc

    CAD常用命令大全全解 1.3darray 3a 三维阵列 2.3dclip 设置剪切平面位置 3.3dcorblt 继续执行3DORBIT命令 4.3DDISTANCE 距离调整 5.3DFACE ...

  2. Linux系统认知——常用命令(全)

    文章目录 一.帮助命令 1.man(查看帮助手册) 2.info(阅读 info 格式的文档) 3.whatis(查询命令功能) 二.文件及目录相关命令 1.touch(创建新的空文件,改变已有文件的 ...

  3. python语言命令大全-Python常用命令最全合集

    文章目录 一.Python环境配置命令 二.Python 常用命令 三.pip管理工具命令 四.发布包到pypi(官网)命令 Mac 电脑自带python2.x版本,终端输入 python -V // ...

  4. Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置

    两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下.写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠谱的. 由浅入深,主要介绍maven的用途.核心概念(Pom.Reposito ...

  5. git merge用法_常用命令之git操作(进阶篇)

    几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作. 有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系 ...

  6. Redhat linux常用命令(全)

    1.startx                     从文本界面进入图形界面 2.ls  -lhar                  显示目录与文件 ls  -lrt              ...

  7. Linux 基本命令及用法,Linux常用命令详解和用法整理 新手站长必备知识要点

    在租用 第一.状态查询命令 查看内存占用命令:free(可选参数 -m -g) 磁盘使用情况:df(可选参数-h) 查看端口被占用:lsof -i:端口号 例如,查看8080端口的被占用情况,如下图所 ...

  8. rpm常用命令集合1

    提要:RPM 是 Red Hat Package Manager 的缩写,原意是Red Hat 软件包管理:本文介绍RPM,并结合实例来解说RPM手工安装.查询等应用: 正文:RPM包管理的用途: 1 ...

  9. CMake常用命令整理

    CMake常用命令整理 转自:https://zhuanlan.zhihu.com/p/315768216 CMake 是什么我就不用再多说什么了,相信大家都有接触才会看一篇文章.对于不太熟悉的开发人 ...

最新文章

  1. 计算机osi模型的功能osi,OSI基本参考模型是什么 OSI基本参考模型各层功能介绍【图文】...
  2. 中国发布自主开发的域名系统基础软件 “红枫”
  3. SAP系统未清账和已清账的区分
  4. 浅谈unity中gamma空间和线性空间
  5. Android 布局以及优化资料汇总
  6. Image:介绍一些跟图片有关的控件,如图片展示特效,图片生产,图片保护等
  7. 《推荐系统笔记(十七)》userCF和itemCF —— 基于领域的推荐
  8. python3怎么使用qstring_PyQt的QString和python的string的区别
  9. 西数绿盘的“C1门”!!!
  10. 实数系与实数定理(下)
  11. 大型网站技术架构-第4篇 架构师
  12. Windows 11中文官方版正版下载
  13. 美丽的诗句 撩妹首选哦!
  14. 再也找不到理由 打扰你_伤感日志
  15. Python 实现 周志华 《机器学习》 BP算法
  16. 【Win7虚拟内存怎么设置最好】
  17. [Cortex-M3]-0-M3介绍
  18. php.ini ecshop,ecshop网店系统在服务器上的安全设置方法
  19. Odoo14免费开源ERP实施指南:CRM功能应用篇(2)
  20. 【Python】scipy.spatial.Delaunay中文教程

热门文章

  1. Caused by:java.lang.IllegalStateException at android.media.MediaPlayer._setDataSource(Native Method)
  2. WGS84经纬度坐标与WEB摩卡托坐标转换
  3. JAVA 运行与开发环境配置(二)- hello java
  4. 原生JS DOM操作方法汇总
  5. C#线程系列讲座(3):线程池和文件下载服务器
  6. 《Doing It - Management 3.0 Experiences》作者访谈
  7. mysql之 explain、optimizer_trace 执行计划
  8. 为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
  9. Linux权限控制命令
  10. ArcGIS Server 开发之鹰眼地图的实现