cmake基础(1)——简单项目

本节将围绕着hello world展开介绍如何创建一个简单的项目。

一、最小项目

1.准备工作

首先,新建一个目录01用来存放当前项目,并在目录下创建main.cpp和CMakeLists.txt文件,两者文件内容如下:

#include <iostream>
using namespace std;int main(int argc, char* argv[]){ std::cout << "hello cmake" <<std::endl;
} 
project(Hello)
add_executable(hello main.cpp)

2.开始构建

完成准备工作后,此时目录结构如下:

此时,在当前目录打开命令行,输入:

cmake .

结果如下:

-- Building for: Visual Studio 15 2017
-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.19042.
-- The C compiler identification is MSVC 19.16.27045.0
-- The CXX compiler identification is MSVC 19.16.27045.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: E:/个人/project/cmake/test01/01

再让我们看下目录内容,发现系统自动生成了很多文件(因为是windows系统,所以生成了sln文件,如果是linux则会生成makefile文件):

我们可以使用vs打开sln文件,进行编译生成产物,这里我们通过命令的方式生成,在当前目录命令行下执行:

cmake --build .

执行成功后,可以在当前目录Debug下发现hello.exe文件

通过.\Debug\hello.exe可以执行程序,打印:

PS E:\个人\project\cmake\test01\01> .\Debug\hello.exe
hello world

3.简单的解释

对于这个简单的CMakeLists.txt,只有两条命令:

project(Hello)
add_executable(hello main.cpp)

3.1 project命令

完整语法如下:

project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]][DESCRIPTION <project-description-string>][HOMEPAGE_URL <url-string>][LANGUAGES <language-name>...])

此处只用到了第一个参数,用于指定项目名称。

  • 注意与最终的产物名无关,仅仅代表生成的项目名(Hello.sln)
  • 此命令会设置变量PROJECT_NAME的值为<PROJECT-NAME>,当前例子则为Hello,但是由于windows下不区分大小写,所以使用时可能变为hello

3.2 add_executable命令

完整语法如下:

add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL][source1] [source2 ...])

指定当前项目的最终产物名name(此处为hello),以及相关的源文件[source1] [source2 ...](此处为main.cpp)

以上介绍了project和add_executable两个命令,通过这两个命令我们就可以构建一个简单的CMakeLists.txt了。

二、构建项目

1.内部构建

上一节我们已经实现了helloworld的最小项目,但是在构建的过程中,我们发现所有的产物和中间产物都在当前目录下,当我们完成编译后,甚至找不到cmakelists文件和源文件。

上一节中

cmake .

这种在当前目录下直接生成的方式可以称为内部构建,与之对应的是外部构建。

2.外部构建

外部构建的方式则会将生成的产物内容统一到一个目录下,步骤如下(在上一节的main.cpp和CMakeLists.txt基础上):

  1. 新建目录,此处使用build目录
  2. 然后切换到build目录下执行cmake ..,生成项目
  3. 继续在build目录下执行cmake --build .,生成最终产物

结果就是,所有的产物内容都到了build目录下:

3.cmake构建目录规则

从上面的内部构建和外部构建我们可以看出cmake的构建规则:

3.1 构建项目信息

cmake srcPath

srcPath表示CMakeLists.txt路径,而生成的项目信息内容则存放到执行命令的当前目录下

3.2 构建产物信息

cmake --build buildPath

通过此命令执行构建,等同于vs下的生成和linux下的make命令。其中buildPath表示前面构建的项目信息目录,生成的所有产物也会存放在此目录下。

4.快捷构建项目信息

上述所说的外部构建,需要建目录,且目录,再执行cmake,步骤繁琐,实际上cmake提供了快捷命令:

cmake -S srcPath -B buildPath

srcPath和buildPath的含义和前面相同,然后再执行cmake --build buildPath执行构建即可。

以上介绍了cmake的构建基本语法内容。

三、一点点改进(set/file)

前面的例子中源码只有main.cpp一个文件,下面我们将封装一个mprint()函数,并将声明和定义放到不同的文件:

#ifndef HELLO_H
#define HELLO_Hvoid mprint();
#endif
#include "hello.h"
#include <iostream>void mprint() {std::cout << "hello world" << std::endl;
}
#include "hello.h"int main(int argc, char *argv[]) {mprint();return 0;}
project(hello)set(SOURCES src/main.cpp src/hello.cpp src/hello.h)message(STATUS "--------PROJECT_NAME:" ${PROJECT_NAME})
message(STATUS "--------SOURCES:" ${SOURCES})add_executable(${PROJECT_NAME} ${SOURCES})

前面的例子因为考虑时最小项目,所以直接在add_executable的时候手动添加了源文件,而实际使用中,文件数目必然很多,而且可能会被多次引用,那么之前的方式就会显得笨重了(每次引用都要写一长串)。

1.通过set(file)设置变量

这里通过set命令将所有依赖的源文件设置到变量SOURCES中,后续只要通过${变量名}就可以获取变量对应的值了。

当然,这里set因为不支持通配符(正则),所以一个个录入源文件依旧显得笨重,还有一种更加简单的方式是file命令(推荐此方式):

file(GLOB|GLOB_RECURSE 变量名 通配符表达式)

比如这里可以使用

file(GLOB SOURCES "src/*.*")

的方式。file和set的实际功能还有其他区别,但是用于获取源文件主要区别在此。

2.通过PROJECT_NAME设置输出名

前面提到project命令会为当前项目生成PROJECT_NAME变量,这里通过${PROJECT_NAME}为add_executable设置输出产物名,此方法的好处就是如果修改项目名,则输出产物会同步修改。

当然,如果想要项目名和输出产物名不同,则不能使用此方式。

3.通过message命令打印

message([<mode>] "message to display" ...)

message支持多种mode打印方式(类似于日志),此处使用的是STATUS模式,可用于日志打印,获取变量值等。

4.基础语法

从前面的内容我们可以总结出CMakeLists.txt中的基础语法:

  1. 在cmake中,变量的值是通过${},如上述的${PROJECT_NAME}就是取变量PROJECT_NAME的值(变量含义后面说明)。但是在if语句中则是直接使用变量名。
  2. 指令(参数1 参数2 ...)
  3. 指令大小写无关,变量和参数是大小写相关的。建议指令小写,变量大写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1383014.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Go把Map转成对象

最近使用了Redis的Hash&#xff0c;把一个对象给存储到了hash里面&#xff0c;具体如下&#xff1a; 现在需要从RedisHash缓存里面把结果给取出来&#xff0c;同时赋值到一个对象上面 result, err : global.GVA_REDIS.HGetAll(context.Background(), key).Result() 问题是resul…

优秀的LCD显示效果

优秀的LCD显示效果 效果图&#xff1a; 程序和源代码链接&#xff1a;http://download.csdn.net/download/zhangxiaoyu_sy/10012770

屏幕显示技术

本文主要介绍多种屏幕显示技术&#xff0c;主要是三大类&#xff0c;LCD&#xff0c;LED&#xff0c;OLED。 一、LCD LCD&#xff08;Liquid Crystal Display&#xff09;中文是液晶显示器。 LCD 的显示技术有很多&#xff0c;常见的有TFT&#xff0c;IPS&#xff0c;SLCD等…

物联网开发平台大 PK,谁是最佳 Pick?

通过这篇文章了解现下流行的几款物联网软件平台的各种功能。 作者 | Miyuru Dayarathna 译者 | 弯月&#xff0c;责编 | 郭芮 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下为译文&#xff1a; 本文以我们对各大物联网供应商的详细分析为基础&#xff0…

uni-app 2.2 发布,大幅度优化 H5 端性能体验 | 技术头条

作者 | uni-app团队 责编 | 伍杏玲 uni-app 自发布以来&#xff0c;已经服务了几十万开发者。但让我们意外&#xff0c;有大量开发者用uni-app只编写H5版&#xff0c;并没有多端发布。 这其实也符合uni-app的初衷&#xff0c;uni-app的定位并不是需要多端发布时才用uni-app。…

第九代小冰惊喜登场,多端融合且琴棋书画样样精通

谈及智能助手&#xff0c;相信大家都不会漏过小冰这款具有划时代意义的产品。从最初的微软小冰到现在的第九代小冰&#xff0c;AI的技术在不断的演进&#xff0c;而小冰也从最初的贴心助手变成了如今琴棋书画样样精通的人工智能前沿技术载体。 北京时间2021年9月22日&#xff…

渡鸦音箱独家测评: 代表百度AI技术尊严的DuerOS, 用户体验真的能过关吗?

撰文 | 宇多田 在今年三个多小时的世界大会主论坛上&#xff0c;百度把一半时间都留给了渡鸦音箱。 这个造型极其吸睛的四色正方体&#xff0c;暂时代替了无人车&#xff0c;成为李彦宏唯一揣到兜里带到乌镇互联网大会的「百度技术代表作」。 与其他重量级 AI 硬件厂商相比&am…

机器视觉 使用halcon的学习之路

2022.9.23 公司安排说学习机器视觉。 当天下午下载安装了halcon软件。看里面的示例程序。 除了纯英文外&#xff0c;很详细的。点中算子函数&#xff0c;按F1会有详细介绍。按F5执行。按F7单步执行。我随便看看啊&#xff0c;就一直按F5 , 看效果。看不出什么名堂。 2022.9.2…

C#开发工控上位机编程 csdn_机器视觉软件开发新人入门必看 --机器视觉软件开发学习路径...

机器视觉是机械、运动、控制、光学、软件、算法于一体的交叉学科,对于学工科的人来说,机械、运动、控制都有一定的了解,对于软件、算法、光学不是很了解。一台设备,有一个到二个机械设计师或者结构工程师,那么这个角色就胜任了机械部分,有一个电气工程师,那么就胜任了控…

OpenCV与机器视觉

最近在网易云课堂把南科大于仕琪团队的OpenCV教程完整看了一遍&#xff0c;对图像处理或者机器视觉又有了一个系统性的理解。OpenCV中文网站就是他创建的&#xff0c;他的研究团队及其相应成果可以在个人网站中查阅。回想过去在图像处理方面的点点滴滴&#xff0c;做了一个详细…

机器视觉入门 Visual Studio 2015 配置 Opencv3.2

本文主要讲述如何在Visual Studio 2015中配置Opencv3.2版本 例子使用的是WIN 10 系统 Visual Studio 2015 OpenCV 3.2 一&#xff0c;下载OpenCV 3.2 OpenCV 官网 &#xff1a; http://opencv.org/ 请根据自己的操作系统选择相应的 或者可以在GitHub 下载&#xff1a; h…

机器视觉软件开发入门(1)

机器视觉软件方面的教材很多&#xff0c;有关于算法层面的&#xff0c;有应用层面的。对于大多数用户来说学习应用就足够了&#xff0c;主要是解决问题啊我们也是从解决问题方面来入手&#xff0c;层层深入。但是许多学习者不知道该从哪里入手有些人误认为必须掌握某种编程语言…

计算机视觉学习路线—计算机视觉入门必读的12本书

计算机视觉入门的一些pdf书籍&#xff0c;按照不同领域帮大家划分了下&#xff0c;涉及深度学习基础、目标检测、Opencv、SLAM、多视图集合、机器视觉、三维重建等~ 12本干货书籍已经给大家打包好了&#xff0c;需要的加小姐姐威信领取 一、计算机视觉 1.计算机视觉算法与应用…

OpenCV 机器视觉入门精选 100 题(附 Python 代码)

点击上方“AI有道”,选择“星标”公众号 重磅干货,第一时间送达 如今深度学习的快速发展给计算机视觉注入了前所未有的新活力!其中在计算机图形学和计算机视觉里面最流行的一个库就是 OpenCV。OpenCV 在自动驾驶和仿生机器人当中的应用非常广泛。 而在 2018 年 11 月份,Ope…

Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介

1. 机器视觉介绍 现在说的机器视觉(Machine Vision)一般指计算机视觉(Computer Vision), 简单来说就是研究如何使机器看懂东西. 就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉&#xff0c;并进一步做图形处理&#xff0c;使电脑处理成为更适合人眼观察…

机器视觉入门1

1.机器视觉检测系统的构成 注&#xff1a;良好的光学系统设计是成功完成机器视觉的应用前提。 一个典型的光学系统包括&#xff1a; 1、摄像机&#xff1a;将通过镜头聚焦于平面光线生产图像 2、光源&#xff1a; 3、镜头 2摄像机–镜头–焦距 说明&#xff1a;景深–在整个聚…

机器视觉软件入门(2)

要做机器视觉软件开发需要必备的技能1、精通C、C、或C#等语言&#xff0c;2、要熟悉机器视觉算法库比如Halcon、CkVision、或OpenCV。这些估计对大多数人来说都是比较困难的&#xff0c;从要掌握的技能来说机器视觉是一门交叉学科&#xff0c;不是简单的软件编程&#xff0c;需…

机器视觉入门

OpenCV安装配置 进入opencv官网 点击library&#xff0c;进入其中的releases&#xff0c;选择最新版的包进行下载。&#xff08;选择好自己电脑对应的版本&#xff09;下载好之后点击它&#xff0c;会生成一个文件夹将文件夹放到自己喜欢的路径环境配置 右键此电脑点击属性 点…

机器视觉算法(系列一)--机器视觉简短入门

原文链接&#xff1a;点我阅读 欢迎大家关注微信公众号“智能算法”&#xff0c;我们一起学习&#xff0c;共同进步! 机器视觉是 人工智能 正在快速发展的一个分支。机器视觉作为生产过程中关键技术之一&#xff0c;在机器或者生产线上&#xff0c;机器视觉可以检测产品质量以便…

机器视觉详解及入门必看

机器视觉系统具有高效率、高度自动化的特点&#xff0c;可以实现很高的分辨率精度和速度。机器视觉系统与被检测对象无接触&#xff0c;安全可靠。人工检测与机器视觉自动检测的主要区别有&#xff1a; 【系统组成】 一个典型的机器视觉系统包括以下部分&#xff1a; 1.照明 照…