CMake语法及CMakeList.txt简单使用小结

目录
  • CMake简单介绍
  • 创建项目
  • CMake语法
    • 常用的命令
    • 常用的变量
  • 简单使用实例

CMake简单介绍

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: 如有需要,请添加测试并安装目标。

运行效果展示

到此这篇关于CMake语法及CMakeList.txt简单使用小结的文章就介绍到这了,更多相关CMake语法及CMakeList.txt使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • CMake编译中的库文件和头文件链接你了解吗

    目录 外部库文件.头文件链接 指令 头文件搜索路径 链接库文件 实例 新建工程空间 定义src内容 编译 总结 外部库文件.头文件链接 指令 头文件搜索路径 INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) [AFTER|BEFORE] :添加方式,默认 AFTER AFTER:在后方进行追加内容(新加入内容在后) BEFORE:在前方进行追加内容(新加入内容在前) dir:头文件路径地址,含有空格的路径应用双引号括起 链接库文

  • windows下vscode使用cmake的方法

    说在前头: cmake的作用,是通过你的CMakeLists文件,根据你的工程自动帮你成makefile文件.优点是CMakeLists非常简单好写,makefile写起来则比较复杂. 有了makefile文件,你就只需要使用编译器的make指令,便可以生成最终的可执行文件 不同的编译器,所对应的makefile有差异,如mingw的,visual studio的等等,因此使用cmake前,应指明它的文件生成对象是什么,在vscode里面的用户设置文件里面应写上这么一行: "cmake.gene

  • VsCode配置C++/Cmake的步骤详解

    Reference https://zhuanlan.zhihu.com/p/87864677 步骤 1.安装VSCode,直接在官网下载 安装即可 2.配置C/C++环境,安装MinGW编译器,也可以在 官网下载安装 3.MinGW编译器刚才下载的是个下载器,直接双击安装,配置X86和WIN32,指定下载目录(需要记住,之后会用,并且目录不能有空格) 4.下载完成之后,将刚才下载目录下的bin文件夹目录配置到环境变量里 5.CMD窗口输入gcc -v不报错就证明配置成功 6.VSCode中搜索

  • CMake的简单应用

    各种不同的Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别.如果软件想跨平台,必须要保证能够在不同平台编译,这就得为每一个Make工具写一次 Makefile ,这将是一件让人抓狂的工作.使用CMake工具就可以很好的解决这个问题. CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile.通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程.CMake自动生成的Makefile

  • vs2019+cmake实现Linux远程开发的方法步骤

    在上一篇文章中我们介绍了使用vs2019作为远程Linux系统的开发环境,但我们是创建的传统的sln项目,而对于Linux开发者来说以autotools或是cmake进行项目结构的组织更为简单直观,也符合在Linux环境上的习惯. autotools是较为古老的也是使用最为广泛的构建系统,你在Linux上总是避免不了类似./configure && make这样的命令,背后就是autotools为你完成了检测系统环境到生成makefile的一系列工作. cmake是较新的一种工具,auto

  • 使用CMake构建OpenCV项目过程解析

    项目结构 为了使整个项目更加条理,我们的文件夹采用如下组织方式: bin build CMakeLists.txt src 其中bin目录用于放编译生成的可执行文件,build目录用于cmake构建项目,src用于放源代码. OpenCV源文件 下面是我们写的一个OpenCV示例代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgpro

  • CMake语法及CMakeList.txt简单使用小结

    目录 CMake简单介绍 创建项目 CMake语法 常用的命令 常用的变量 简单使用实例 CMake简单介绍 Cmake主要用于开发跨平台的C++项目,对于Windows程序员来说,在Linux上开发C++程序会非常困难,一来没用过makefile,其语法非常生疏难懂,二来visual studio编译器实在优点太多(目前最新推出的vs2022中开启效率得到了质的提升,而且内置的IntelliCode更是直呼内行).这就导致C++不同于其他语言,硬生生催生出Windows程序员和Linux程序员

  • vim的一些常用简单操作小结

    前言 vim乃Linux下相当牛掰一文本处理神器也,是vi编辑器的升级版,全称叫Vi IMproved. 而vi则是Visual Interface的缩写,他们处理都是ASCII码字符数据,熟练使用vim绝对是你成为Linux大牛不可或缺的本领,所谓千里之行,始于足下. 下面就本人学习过程中一些非常常用到的比较实用的用法做一下总结 vim 撤销和恢复操作 在不可编辑模式下,使用 u 即可撤销上一次操作,使用 Ctrl+r 恢复上一次操作. vim 区块选择和复制粘贴 vim 进入某个文件,按 v

  • JavaScript基础语法让人疑惑的地方小结

    复制代码 代码如下: /* JS基础语法中,几个比较容易让人疑惑的地方. */ /* == === */ function de() { var ab = 25; //数值 var ba = "25"; //字符串 if (ab == ba) { //==,会先转换,后比对. //alert("b"); } if (!(ab === ba)) { //===不会转换,而进行直接比对,ab是数值类型数据,而ba是字符串类型数据 //alert("a"

  • Android开发中WebView的简单使用小结

    前言 WebView(网络视图)在Andorid中就是用来显示网页的,下面我们来一起看看它是如何使用的. 一.基本使用 1.声明权限,WebView不可避免地要用到网络,我们要加上网络访问权限. <uses-permission android:name="android.permission.INTERNET"/> 2.放入Layout <WebView android:layout_width="match_parent" android:la

  • C语言中压缩字符串的简单算法小结

    应用中,经常需要将字符串压缩成一个整数,即字符串散列.比如下面这些问题: (1)搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.请找出最热门的10个检索串. (2)有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M.返回频数最高的100个词. (3)有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复.要求你按照query的频度排序. (4)给定a.b两个文件

  • IDEA新建javaWeb以及Servlet简单实现小结

    刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入Tomcat的servlet包才能使用servlet 导入包的方法是创建项目并配置好Tomcat后,File->Project Structure,点击 Modules --> 选中项目"JavaWeb" -->切换到 Dependencies 选项卡 --> 点击右边

  • 谈谈Spring Boot 数据源加载及其多数据源简单实现(小结)

    业务需求 提供所有微服务数据源的图形化维护功能 代码生成可以根据选择的数据源加载表等源信息 数据源管理要支持动态配置,实时生效 附录效果图 实现思路 本文提供方法仅供类似简单业务场景,在生产环境和复杂的业务场景 请使用分库分表的中间件(例如mycat)或者框架 sharding-sphere (一直在用)等 先来看Spring 默认的数据源注入策略,如下代码默认的事务管理器在初始化时回去加载数据源实现.这里就是我们动态数据源的入口 // 默认的事务管理器 ppublic class DataSo

  • Python使用sklearn库实现的各种分类算法简单应用小结

    本文实例讲述了Python使用sklearn库实现的各种分类算法简单应用.分享给大家供大家参考,具体如下: KNN from sklearn.neighbors import KNeighborsClassifier import numpy as np def KNN(X,y,XX):#X,y 分别为训练数据集的数据和标签,XX为测试数据 model = KNeighborsClassifier(n_neighbors=10)#默认为5 model.fit(X,y) predicted = m

  • Numpy的简单用法小结

    Numpy的简单用法,下面就一起来了解一下 import numpy as np 一.创建ndarray对象 列表转换成ndarray: >>> a = [1,2,3,4,5] >>> np.array(a) array([1, 2, 3, 4, 5]) 取随机浮点数 >>> np.random.rand(3, 4) array([[ 0.16215336, 0.49847764, 0.36217369, 0.6678112 ], [ 0.667296

  • PHP多进程简单实例小结

    本文实例讲述了PHP多进程.分享给大家供大家参考,具体如下: PHP创建多进程需要使用到pcntl模块 在编译时加上--enable-pcntl打开进程控制支持,不是Unix类系统不支持此模块 php官网介绍http://php.net/manual/zh/book.pcntl.php,创建子进程需要使用到pcntl_fork(),文档上介绍该函数说 ,pcntl_fork - 在当前进程当前位置产生分支(子进程). 译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继

随机推荐