cmake用法及常用命令总结

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

1240652-20190723164643929-1370698378.png

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

1240652-20190723164704304-1560695016.png

按照目录结构加入文件(筛选器)

 
  1. #按目录结构加入文件

  2. macro(create_filters source_files)

  3. if(MSVC)

  4. # 获取当前目录

  5. set(current_dir ${CMAKE_CURRENT_SOURCE_DIR})

  6. foreach(src_file ${${source_files}})

  7. # 求出相对路径

  8. string(REPLACE ${current_dir}/ "" rel_path_name ${src_file})

  9. # 删除相对路径中的文件名部分

  10. string(REGEX REPLACE "(.*)/.*" \\1 rel_path ${rel_path_name})

  11. # 比较是否是当前路径下的文件

  12. string(COMPARE EQUAL ${rel_path_name} ${rel_path} is_same_path)

  13. # 替换成Windows平台的路径分隔符

  14. string(REPLACE "/" "\\" rel_path ${rel_path})

  15. if(is_same_path)

  16. set(rel_path "\\")

  17. endif(is_same_path)

  18.  
  19. # CMake 命令

  20. source_group(${rel_path} FILES ${src_file})

  21. endforeach(src_file)

  22. endif(MSVC)

  23. endmacro(create_filters)

  24.  
  25.  
  26. #用法

  27. #所有文件保存在一个变量中

  28. file(GLOB_RECURSE all_files *.h *.cpp *.c *.cc)

  29. create_filters(all_files)

  30.  
  31. add_executable(MFCDemo

  32. ${all_files}

  33. )

根据debug和release自动区分表示debug和release文件夹

 
  1. #debug版本$(Configuration)表示debug文件夹

  2. link_directories(${PROJECTS_PATH}/out/$(Configuration))

将当前目录添加到环境变量中

可以用bat命令

setx ZYB_MEDIA_DIRECTORY %cd%

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

 
  1. #变量ZYB_MEDIA_DIRECTORY表示上述bat文件所在目录

  2. set(ZYB_MEDIA_DIRECTORY $ENV{ZYB_MEDIA_DIRECTORY})

构建成功后复制依赖的dll到指定目录

 
  1. set(LIB_FILE ${ZYB_MEDIA_DIRECTORY}/third_party/ffmpeg/lib-x86)

  2. #构建成功后复制依赖的dll

  3. add_custom_command(TARGET PlayerTest POST_BUILD

  4. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avcodec-58.dll ${EXECUTABLE_OUTPUT_PATH}/$(CONFIGURATION)

  5. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avfilter-7.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>

  6. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avformat-58.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>

  7. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/avutil-56.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>

  8. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/postproc-55.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>

  9. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/swresample-3.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>

  10. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/swscale-5.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>

  11. COMMAND ${CMAKE_COMMAND} -E copy ${LIB_FILE}/SDL.dll ${EXECUTABLE_OUTPUT_PATH}/$<CONFIGURATION>

  12. )

设置宏定义

 
  1. #宏定义

  2. add_definitions(-D WEBRTC_WIN)

  3. add_definitions(-D CURL_STATICLIB)

  4. add_definitions(-D NOMINMAX)

MFC相关

 
  1. # 1 在静态库中使用MFC,2共享方式使用mfc

  2. set(CMAKE_MFC_FLAG 1)

  3. #共享DLL中使用 MFC

  4. #add_definitions(-D_AFXDLL)

  5. #UNICODE字符集

  6. add_definitions(-DUNICODE -D_UNICODE)

  7. #子系统窗口

  8. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS")

Qt相关

 
  1. cmake_minimum_required(VERSION 3.2.0)

  2. project(QtDemo)

  3.  
  4. #设置工程包含当前目录,非必须

  5. set(CMAKE_INCLUDE_CURRENT_DIR ON)

  6.  
  7. #打开全局moc,设置自动生成moc文件,一定要设置

  8. set(CMAKE_AUTOMOC ON)

  9. #打开全局uic,非必须

  10. set(CMAKE_AUTOUIC ON)

  11. #打开全局rcc,非必须,如需打开,注意修改33行的qrc文件名

  12. #set(CMAKE_AUTORCC ON)

  13.  
  14. #查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加

  15. find_package(Qt5Widgets)

  16. find_package(Qt5Core)

  17. find_package(Qt5Gui)

  18. find_package(Qt5Network)

  19.  
  20. include_directories(${PROJECTS_PATH}/../src)

  21. include_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/handler)

  22. include_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/handler/third_party/breakpad/src)

  23.  
  24. link_directories(${ZYB_MEDIA_DIRECTORY}/third_party/qBreakpad/lib/$(Configuration))

  25. link_directories(${PROJECTS_PATH}/out/$(Configuration))

  26.  
  27. #查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量

  28. #查找设置当前文件夹中所有的ui文件

  29. FILE(GLOB UI_FILES "./*.ui")

  30.  
  31. file(GLOB_RECURSE all_files *.h *.cpp *.c *.cc LY_Utils/*.*)

  32. create_filters(all_files)

  33.  
  34. #通过Ui文件生成对应的头文件,一定要添加

  35. qt5_wrap_ui(WRAP_FILES ${UI_FILES})

  36.  
  37. #添加资源文件,非必须,一旦采用,注意修改相应的qrc文件名

  38. #set(RCC_FILES QtDemo.qrc)

  39.  
  40. #将ui文件和生成文件整理在一个文件夹中,非必须

  41. #source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )

  42.  
  43. SET(EXECUTABLE_OUTPUT_PATH ../out)

  44.  
  45. #创建工程文件

  46. add_executable(QtDemo ${all_files} ${WRAP_FILES})

  47.  
  48. #添加Qt5依赖项

  49. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值