CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。指令是大小写无关的,参数和变量是大小写相关的。但推荐所有使用大写指令。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。html
本身写了一个小例子,包含了静态库和动态库以及基本的依赖关系。编程
#按目录结构加入文件 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版本$(Configuration)表示debug文件夹 link_directories(${PROJECTS_PATH}/out/$(Configuration))
能够用bat命令数组
setx ZYB_MEDIA_DIRECTORY %cd%
以后cmake中就能够用此变量做为当前目录路径post
#变量ZYB_MEDIA_DIRECTORY表示上述bat文件所在目录 set(ZYB_MEDIA_DIRECTORY $ENV{ZYB_MEDIA_DIRECTORY})
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)
# 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")
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)
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)ui
上面的语句能设置可执行文件的输出目录.net
在Win + VS环境下,会自动在你所设置的目录后面扩展一层
在Linux + GCC环境下,不管是Debug仍是Release,生成的可执行程序会直接放在你所设置的目录下,不会有差别.3d
二. SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../lib)code
上面的语句能设置库文件的输出目录
在Win + VS环境下,会自动在你所设置的目录后面扩展一层
在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使用笔记