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使用笔记

cmake用法及常用命令总结(全)的更多相关文章

  1. cmake用法及常用命令总结

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

  2. linux常用命令的全拼

    Linux常用命令英文全称与中文解释Linux系统   Linux常用命令英文全称与中文解释linux系统 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Print ...

  3. Git深入浅出使用教程:Git安装、远程控制、常用命令(全)

    一.软件安装 1.先安装[Git-2.24.1.2-64-bit.exe]软件.(官网下载的很慢,可以在百度云盘下载我的) 链接:https://pan.baidu.com/s/1uoIS9DWSBp ...

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

    由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal).用法(Archetype意义及创建各种项目).maven常 ...

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

    转自:http://www.trinea.cn/android/maven/ 两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下.写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠 ...

  6. git用法之常用命令[克隆、提交]

    1.克隆/下载项目 1)git clone git@git.soydai.cn:liuxuewen/static-file-3.0.git 或者 2)git clone http://git.soyd ...

  7. iOS中的CocoaPods用法及常用命令

     CocoaPods是什么? ***CocoaPods的使用场景:*** 1. 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用 ...

  8. git用法之常用命令

    1.git 安装好后,如何配置? a: 设置本地用户名.邮箱,很重要!之后的每次提交都会用到这两条信息,说明是谁提交了更新. $ git config --global user.name " ...

  9. ORACLE基本用法及常用命令

    切换ORACLE用户 su - oracle ---------------------------- 重启数据库 sqlplus sys / as sysdba shutdown immediate ...

随机推荐

  1. SpringBoot配置加载顺序

    一般我们会将SpringBoot应用需要的配置内容放在项目工程中,然后通过spring.profiles.active或是通过Maven来实现多环境的支持.但是,当团队逐渐壮大,分工越来越细之后,往往 ...

  2. git git push某一次的commit记录

    $ git push <remote name> <commit hash>:<remote branch name> # Example:$ git push o ...

  3. 基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 下面小编就为大家分享一篇基于Python中numpy数组的合并实例讲解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 Python中n ...

  4. Windows自动计划任务与ParamStr详解

    ParamStr函数: ParamStr(1),..ParamStr(N) ParamStr(1)代表程序入口的第一个参数,同理,ParamStr(N)代表第N个参数.可通过如下操作进行参数的赋值. ...

  5. Swift细节记录<一>

    1.全局变量记录: import UIKit class HHTSwitchGlobalData: NSObject { var isWaiterAutoPop: Bool = true privat ...

  6. linux中解决出现:^H^H^H^H

    解决出现:^H^H^H^H 把stty erase ^H 添加到.bash_profile中 vim /etc/profile stty erase ^H su root source /etc/pr ...

  7. 图解 perspective && perspective-origin && transform3d && transform-origin

    perspective && perspective-origin perspective是物体相对于画布的视距距离 perspective-origin是物体在画布位置的中心视点 t ...

  8. build时自动清除console

    一.第一种方法 安装 babel-plugin-transform-remove-console 修改 babel.config.js 文件 let transformRemoveConsolePlu ...

  9. 了解 Selenium 定位方式

    ※元素定位的重要性:在于查找元素 And 执行元素 定位元素的三种方法 1.定位单个元素:在定位单个元素时,selenium-webdriver 提示了如下一些方法对元素进行定位.在这些定位方式中,优 ...

  10. burpsuite破解网页密码

    1.暴力破解网页登录 http://jingyan.baidu.com/article/200957619c8739cb0721b4ff.html https://zhuanlan.zhihu.com ...