CMake语法及CMakeList.txt使用
ufgnix0802 人气:0CMake简单介绍
Cmake主要用于开发跨平台的C++项目,对于Windows程序员来说,在Linux上开发C++程序会非常困难,一来没用过makefile,其语法非常生疏难懂,二来visual studio编译器实在优点太多(目前最新推出的vs2022中开启效率得到了质的提升,而且内置的IntelliCode更是直呼内行)。这就导致C++不同于其他语言,硬生生催生出Windows程序员和Linux程序员两个群体,直到出现CMake这个局面才被打破。
CMake可以在Linux上自动生成makefile,在Windows下可以生成vs解决方案sln,对于大规模跨平台项目绝对是首选。相比于makefile,CMake语法要简单的多。自vs2017之后vs便支持CMake语法,到目前vs2022仍然支持,其效果之不必多说。
TIPS:以下均使用vs2022进行介绍。
创建项目
TIPS:解决方案就是项目的合集,项目是对应每一个静态库,动态库和可执行文件的编译目标。
创建完成
TIPS:建议红色框框里面的内容一定要看一遍。
用CMake构建一个项目工程,是通过一个或多个CMakeLists.txt文件来控制的。CMakeLists.txt中包含一系列命令来描述需要执行的构建。
CMake语法
在CMakeLists.txt中的命令的语法,都是形如下面这种格式:
command (args ...)
- command:命令的名字
- args:参数列表。多个参数使用空格隔开。
常用的命令
cmake_minimum_required
设置项目要求的CMake最低版本号,如果当前版本的CMake低于所需的值,它将停止处理项目并报告错误。注意务必在project
之前调用该命令,一般是在CMakeLists.txt文件开头调用。命令格式为:
cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])
使用示例:
cmake_minimum_required(VERSION 2.8.5) cmake_minimum_required(VERSION 3.8)
add_executable
使用指定的源文件给项目添加一个可执行文件。命令格式为:
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
参数介绍:
- name:该命令调用列出的源文件来构建的可执行目标。 对应于逻辑目标名称,在项目中必须是全局唯一的。构建的可执行文件的实际文件名是基于本机平台的约定。
- WIN32:如果给出WIN32,则在创建的目标上设置属性WIN32_EXECUTABLE。
- MACOSX_BUNDLE:如果给定MACOSX_BUNDLE,将在创建的目标上设置相应的属性。
- EXCLUDE_FROM_ALL:如果给定EXCLUDE_FROM_ALL,将在创建的目标上设置相应的属性。
- source:源码列表。
使用示例:
add_executable (CMakeClient0331 "CMakeClient0331.cpp" "CMakeClient0331.h")
project
为整个工程设置一个工程名。命名格式为:
project (<PROJECT-NAME> [LANGUAGES] [<language-name>...]) project (<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [LANGUAGES<language-name>...])
使用示例:
project ("CMakeClient0331")
set
将一个CMAKE变量设置为给定值。命名格式为:
set(<variable> <value>... [PARENT_SCOPE])
使用示例:
set(COCOS2D_ROOT ${CMAKE_SOURCE_DIR}/cocos2d)
常用的变量
使用${ }进行变量的引用。例如:message(${CMAKE_VERSION}),表示向用户显示cmake的完整版本号。CMake还提供了很多有用的变量。以下仅列举常用的变量:
CMAKE_BINARY_DIR
:构建树的顶层路径CMAKE_COMMAND
:指向CMake可执行文件的完整路径CMAKE_CURRENT_BINARY_DIR
:当前正在被处理的二进制目录的路径。CMAKE_CURRENT_SOURCE_DIR
:指向正在被处理的源码目录的路径。CMAKE_HOME_DIRECTORY
:指向源码树顶层的路径。CMAKE_PROJECT_NAME
:当前工程的工程名。CMAKE_ROOT
:CMake的安装路径。CMAKE_SOURCE_DIR
:源码树的顶层路径。CMAKE_VERSION
:cmake的完整版本号。PROJECT_BINARY_DIR
:指向当前编译工程构建的全路径。<PROJECT-NAME>_BINARY_DIR
:指向当前编译工程构建的全路径。<PROJECT-NAME>_SOURCE_DIR
:指向构建工程的全路径。PROJECT_SOURCE_DIR
:指向构建工程的全路径。PROJECT_NAME
:project命令传递的工程名参数。<PROJECT-NAME>_VERSION
:项目的完整版本号。
内置宏
- EXECUTABLE_OUTPUT_PATH :用于确定可执行文件的输出路径
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY:静态库lib的输出路径
- CMAKE_DEBUG_POSTFIX:设置Debug版本下的库文件后缀名
- CMAKE_RELEASE_POSTFIX:设置Release版本下库文件的后缀名
简单使用实例
以下项目中的CMakeLists.txt文件内容如下(应用场景为:生成客户端和服务端的可执行文件,同时指定生成可执行文件的目录),根目录的CMakeLists.txt无需修改。
# CMakeList.txt: Server0327 的 CMake 项目,在此处包括源代码并定义 # 项目特定的逻辑。 # cmake_minimum_required (VERSION 3.8) #exe程序的路径 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin) # 将源代码添加到此项目的可执行文件。 add_executable (Server "Server0327.cpp" "Server0327.h") add_executable (Client "CMakeClient0331.cpp" "CMakeClient0331.h") # TODO: 如有需要,请添加测试并安装目标。
运行效果展示
加载全部内容