室友打了一把王者我学会了CMake的使用(初学者必备)

news/2024/4/30 12:12:49/文章来源:https://blog.csdn.net/qq_56999918/article/details/126962905

CMake

    • CMake介绍
    • CMake安装以及简单的使用
    • 利用CMake生成动静态库
    • 链接动静态库

CMake介绍

CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。本文的目的主要是入门CMake并不会涉及复杂的CMake的使用,第二个目的就是用来复习的

CMake安装以及简单的使用

1.安装CMake,在Centons当中我们可以使用sudo yum install cmake

sudo yum install cmake

安装完成之后我们可以使用cmake --version命令查看我们当前cmake的版本信息

在这里插入图片描述

下面我们来演示一下CMake的简单使用,先从最简单的看起一起来感受一下CMake的使用吧,下面我们来编写一个main.cc

#include<iostream>
using namespace std;
int main()
{cout<<"hello word"<<endl;return 0;
}

然后了我们在main.cc相同的目录下创建一个CMakeLists.txt文件,编写的内容如下:

cmake_minimum_required(VERSION 2.8)project(demo)add_executable(main main.cc)

解释:

  • 其中第一行的意思是要求cmake的最低版本要求是2.8,注意这一句必须放在第一句否则有可能会报错
  • 第二行表示工程信息,此处表示我们的这个工程的名字叫做demo.
  • 第三行也是最关键的,这里表示生成的可执行程序的名字叫做main,使用的源文件叫做main.cc

下面我们在终端上输入cmake . 会有如下信息出来:

在这里插入图片描述

此时我们可以看到目录下有一个Makefile文件,还有一些cmake允许之后产生的文件,此时我们在在终端上输入make:

在这里插入图片描述

我们发现整个目录下生成了main这个可执行文件了,我们可以运行他了:

在这里插入图片描述

我们看此时运行成功,如果我们看到了运行的结果。此时我们发现当我们使用cmake之后会产生很多的文件这些文件在一定程度上影响了我们的源文件因此我们可以在当前目录创建一个build目录:

在这里插入图片描述

我们进入到build这个目录当中来然后再输入cmake … :
在这里插入图片描述
此时我们发现之前生成的一堆文件现在就来到了build这个目录下来了,此时不会影响我们的源文件所在的目录。
在这里很多老铁可能就要说了要这么麻烦吗直接g++一行不就行了,下面我们来看一下比较复杂的目录结果此时cmake就比g++要舒服的多了
在这里插入图片描述
对应add.h当中的代码:

#pragma once
int add(int a,int b);

对应add.c代码:

int add(int a,int b){return a+b;
}

对应main.cc代码:

#include<iostream>
#include"add.h"
using namespace std;
int main()
{cout<<add(10,20)<<endl;
}

下面我们来看看此时这个CMakeLists.txt改如何书写

cmake_minimum_required(VERSION 2.8)
project(demo)
include_directories(./include)
set(SRC_LIST ./src/add.cc ./src/main.cc)
add_executable(main ${SRC_LIST})

下面解释一下上面的书写:

  • 其中第一行和第二行之前以及说过了在这里不在重复说明
  • 由于我们main.cc当中包含了add.h所有我们需要指明头文件在哪里找,在这里include_directories 用来包含头文件目录
  • set 用来显示定义变量,可以有多个以也可以有一个,多个可以空格分隔。如果我们想要取变量当中的值我们想要使用${}。在这里说明一下参数和变量是大小写无关的
  • 最后一行在前面以及说明过了,${SRC_LIST}是用来取出SRC_LIST变量当中的值

下面我们进入到build目的当中输入cmake …
在这里插入图片描述
发现运行成功当然我们也可以在main.cc当中指定add.h这个头文件在哪里.在上面如果源文件有100多个这要敲到猴年马月此时我们就可以使用aux_source_directory(dir var)。第一个参数代表的是目录,第二个参数var是用来存放源文件列表的。此时我们也可以将上面的CMakeLists.txt改为:

cmake_minimum_required(VERSION 2.8)
project(demo)
include_directories(./include)
aux_source_directory(./src SRC_LIST)
add_executable(main ${SRC_LIST})

但是aux_source_directory()也是有弊端的,他会将指定目录下所有的源文件都加入进来,如果在一个目录下有一些源文件我们不想加入进来此时aux_source_directory就不太合适了。此时我们用set定义变量指定特定的源文件即可.

一般的话我们不会这么干,一般我们会将可执行文件放到一个bin目录下,这样会让结构更加的清晰下面我们在把目录结构调整一下:
在这里插入图片描述
这时候我们需要修改一下最外层的CMakeLists.txt.内容如下:

cmake_minimum_required(VERSION 2.8)
project(demo)
add_subdirectory(./src)

在这里出现了一个新的命令add_subdirectory(),这个命令可以向当前工程添加存放源文件的子目录,并且可以指定中间二进制和目标二进制存放的位置。在这里指定的src目录下存放了源文件,当cmake执行到这里的时候,会进入src目录下去找CMakeLists.txt.所有我们需要在src目录下建立一个CMakeLists.txt。内容如下:

cmake_minimum_required(VERSION 2.8)
aux_source_directory(./ SRCLIST) #把当前目录下的源文件加载进来
include_directories(../include) #指定头文件
add_executable(main ${SRCLIST})
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

在这里使用set来定义变量。EXECUTABLE_OUTPUT_PATH和PROJEXT_SOURCE_DIR是CMake自带的预定义变量和PROJEXT_SOURCE_DIR变量相对应的还有一个叫做PROJECT_BINARY_DIR.
下面我们来解释一下:

1.EXECUTABLE_OUTPUT_PATH:目标二进制可执行文件存放的位置
2.PROJECT_SOURCE_DIR:代表的工程的路径
3.PROJECT_BINARY_DIR:代表编译的是编译的路径

在这里使用set的意思是将生成的可执行程序放到工程所在路径的bin目录下,下面我们进入build目录在终端上输入cmake …
在这里插入图片描述
运行是ok的下我们我们进入到上级目录的bin目录下
在这里插入图片描述

利用CMake生成动静态库

之前博主写过利用makefile制作动静态库在这里使用CMake来演示一下生成动静态库相比makefile真的好用多了,下面我们来调整一下啊目录结构
在这里插入图片描述
下面我们调整一下最外层的CMakeLists.txt,其内容如下:

cmake_minimum_required(VERSION 2.8)
project(demo)
add_subdirectory(add)

下面我们一起来看看add目录下的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
aux_source_directory(./ SRC_LIST)
add_library(add_shared SHARED ${SRC_LIST})
add_library(add_static STATIC ${SRC_LIST})
set_target_properties(add_shared PROPERTIES OUTPUT_NAME "add")
set_target_properties(add_static PROPERTIES OUTPUT_NAME "add")
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

在这里我们解释一下一些新的命令和遇定变量:

1.add_library:

  • 第一个参数代表的动静态库的名字
  • 第二个参数代表的是你想生成的是动态库还是静态库,如果我们没有写默认为静态库.
  • 第三个指的是生成动静态库的源文件

2.set_target_properties
这个是用来设置输出名称还有设置库的版本号等

3.LIBARARY_OUT_PATH:库文件默认的输出路径,这里设置为工程目录下的lib目录下

下面我们进入到build目录下cmake …然后在make在进入到lib当中
在这里插入图片描述
注意:我们在前面使用了set_target_properties重新设定了库文件的名字。其实也可以不使用那么库的名字就是add_library里面定义的名字但是动态库和静态库的名字不能相同。此时我们可以使用set_target_properties把名字设置为相同,只是后缀不同而已这样相对起来好看一些

总结:

在这里插入图片描述

链接动静态库

上面我们以及生成好了动态库和静态库下面我们来看如何使用他们,首先我们将build文件当中的所有文件都区别删掉。下面我们需要修改一下目录结构:
在这里插入图片描述
src目录下main.cc的内容如下:

#include<iostream>
using namespace std;
#include"add.h"
int main()
{cout<<add(10,20);return 0;
}

修改当前工程目录下的CMakeLists.txt如下:

cmake_minimum_required(VERSION 2.8)
project(demo)
add_subdirectory(src)

src目录下CMakeLists.txt如下:

aux_source_directory(. SRC_LIST)
include_directories(../add)
link_directories(${PROJECT_SOURCE_DIR}/lib)
add_executable(main ${SRC_LIST})
target_link_libraries(main add.so)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

在这里又出现了2个新的命令link_directories和target_link_libraries,下面来解释一下:

1.link_directories:添加非标准共享库的搜索路径
target_link_libraries:一个库当中可能有多个动太库你要告诉它你要链接的是那个

然后我们在回到build目录下在终端上敲上cmake … 然后再进入到bin目录下:
在这里插入图片描述
在lib目录下有两个库一个是动态库一个是静态库如果我们不指明后缀默认链接的是动态库,如果lib目录下只有静态库就只会去链接静态库。

扩展:有时候了我们希望在编译代码的时候想要添加一些编译选项,如:-std=c++11,-Wall等等
我们此时就可以使用add_compile_options来进行操作。由于这个比较简单在这里就不做演示了。

以上就是我学习CMake的一些记录,举的列子都比较的简单旨在帮助大家快速入门CMake,同时也是问了自己后面复习使用。CMake的知识比较的多更多的可以去官网学习或者在一个完善的项目当中学习,CMake可以不用让我们去编写复杂的Makefile并且是跨平台的是一个非常强大的工具。如果有错误的话请各位老铁指正谢谢阅读

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web协议-接口测试-Python自动化面试题

1、http和https的区别 http是超文本传输协议&#xff0c;端口是80 https是由SSLhttp协议构成&#xff08;https多了个加密协议&#xff0c;比http更安全&#xff09;&#xff0c;端口是443 2、TCP和UDP的区别 两者都属于传输层协议 TCP是面向连接的&#xff0c;建立TCP需要三…

Mysql主从切换流程

Mysql主从切换流程1.Mysql 版本2.场景3.环境4.切换步骤4.1 切断应用对主库的流量4.2 主库备库设置只读4.3 查看备库复制进程状态4.4 比对主备两边的GTID是否一致4.5 确认是否真正同完4.6 从库停掉复制进程并清空主从信息4.7 从库关闭只读开启读写&#xff0c;转为新主库4.8 主库…

在线反馈,急速解决,移动云视频客服让沟通从此不设限

对于产品而言&#xff0c;用户体验至关重要&#xff0c;而客服的服务质量就是用户体验的“灵魂”。随着移动云多达230全栈产品在云计算市场中的热卖&#xff0c;人们在使用产品中难免也会产生诸多问题&#xff0c;考虑到消费者在与客服沟通时打字描述太繁琐&#xff0c;在线沟通…

九零后程序员心塞:“30岁,月薪还没过万,是我的问题吗”

2020年有职场专家指出&#xff1a; 四千元的月薪&#xff0c;在国内算是中等的薪资水平。 每个月能赚到四千块&#xff0c;就打败了一半的国人&#xff1b; 如果每个月能赚8000~10000&#xff0c;那你就能跑赢90%的国人。 这几个数字是怎么得出来的&#xff1f; 我们可以从两…

上次没砍我的,这次我又来了;看完这篇还不明白 Binder 你砍我

最近一段时间由于工作&#xff0c;接触到 Framework 部分比较多一点&#xff0c;也难免要和 Binder 打一些交道&#xff0c; 因为在 Android 系统中&#xff0c;每一个应用程序都是由一些 Activity 和 Service 组成的&#xff0c;这些 Activity 和 Service 有可能运行在同一个进…

java基于springboot+vue的旅游心得分享攻略系统 elementui

SpringBoot是当前最流向的一个框架&#xff0c;它的配置更加的简单&#xff0c;使开发变得更加的简单迅速。 Spring Boot 的基础结构共三个文件&#xff0c;具体如下&#xff1a; src/main/java&#xff1a;程序开发以及主程序入口&#xff1b; src/main/resources&#xff1a;…

vue serve及其与vue-cli-service serve之间的关系

vue serve及其与vue-cli-service serve之间的关系 目录 vue serve及其与vue-cli-service serve之间的关系 一、前言 二、vue命令 三、package.json的preset预置的配置命令参数 3.1、依赖与开发依赖 3.2、vue/cli-service 的内部 3.3、vue -***命令如何跑起来 四、vue …

HTML篇三——(2)

目录一、HTML常用标签1.5 文本格式化标签1.6 <div> 和<span>标签一、HTML常用标签 标题标签、段落标签、换行标签见&#xff1a;https://editor.csdn.net/md/?articleId126970642 1.5 文本格式化标签 文本格式化标签是为文字设置粗体、斜体以及下划线等效果&am…

有了这个 Python 库,以后再也不用写正则表达式了

正则表达式大家应该有了解过吧&#xff1f;它功能很强大&#xff0c;但有一个痛点就是不太容易读写&#xff0c;我们需要了解正则的很多语法规则才能写出一个健壮的正则表达式&#xff0c;很多朋友估计听到正则表达式估计都焦头烂额了。 就没有解决办法吗&#xff1f; 有的&a…

单播以及多播的书写实验

实验目的&#xff1a; 学习对每个分类单播的理解以及书写 学习对每个分类多播的理解以及书写 实验说明&#xff1a; 通过此实验练习&#xff0c;可以更好的掌握IPv6地址书写以及分类 实验环境&#xff1a; 两台支持SPSERVICES的IOS的路由器 直通线以及串口线 实…

树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

首先我们要知道&#xff0c;驱动的两大利器&#xff1a;电路图&#xff08;通过电路图去寻找寄存器&#xff09;和芯片手册 一、寄存器的介绍 芯片手册第六章的89页&#xff0c;GPIO有41个寄存器&#xff0c;所有访问都是32位的。Description是寄存器的功能描述。GPFSEL0&…

2022年最新《Java八股文面试宝典》全网独一份!(效率最高、知识最新、包含各个技术栈)

今天在脉脉刷到了这么一条消息&#xff0c;现在这个大环境&#xff0c;都后悔学Java了&#xff0c;想转行学前端&#xff0c; 看完很是震惊&#xff0c;据大数据统计&#xff0c;Java的待遇是要好过前端的。小伙伴竟然被卷到想要转行......但是行情这个东西&#xff0c;也不是我…

vue3.x之isRef toRefs isRef readonly 公共数据配置 axios配置 路由配置

isRef toRefs toRef 参数&#xff1a; (源对象 , 源对象属性) 可以用来为源响应式对象上的某个 property 新创建一个 ref。然后&#xff0c;ref 可以被传递&#xff0c;它会保持对其源 property 的响应式连接。 也就是说源响应式对象(toRef的第一个参数) 上的某个 property…

【3D视觉】PointNet解析

您好&#xff0c;各位&#xff01;今天就基于3D点云数据的分类以及分割模型 : PointNet与PointNet做一个简单的解析&#xff0c;解析部分将结合论文与代码&#xff0c;加上一些我个人微不足道&#xff08;也不一定对&#xff09;的见解在里面。 在看PointNet与PointNet之前&am…

第三章实验

实例一print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n") number = int(input("请输入您认为符合条件的数:")) if number%3 == 2 and number%5 == 3 and number%7 == 2:print(number,"符合条件:三三数之剩二,五五数…

GBase 8s是如何实现库中数据安全保障的

随着计算机网络的广泛应用&#xff0c;网上信息的开放性与共享性日益增强&#xff0c;但随之而来的是信息安全问 题愈发严重。数据库是这些数据信息存储的主要场所&#xff0c;因此确保数据库中存储以及存取信息的安 全是确保网络安全的首要问题。为此&#xff0c;需要在通用的…

Nginx在Linux下的安装

✨ Nginx在Linux下的安装安装pcre安装其他的依赖安装Nginx(把压缩包放到opt目录)&#x1f4c3;个人主页:不断前进的皮卡丘&#x1f31e;博客描述:梦想也许遥不可及&#xff0c;但重要的是追梦的过程&#xff0c;用博客记录自己的成长&#xff0c;记录自己一步一步向上攀登的印记…

软件测试 git和gitee集成Pycharm 基于Flask的Mock Server服务器

文章目录1 Git1.1 作用1.2 工具1.3 名称解释2 安装git和注册Gitee3 使用Git(1)clone克隆命令(2)初始化(3)查看文件状态(4)文件提交暂存区(5)提交到本地版本库(6)修改文件(7)查看日志(8)跳转到提交的时间截点4 git和gitee集成Pycharm4.1 在Pycharm安装git和连接gitee(1)新建项目…

交互与前端3 前端需求简单梳理

说明 技术的终点是前端 我是从模型/算法作为起点的,顺着工作的需要和自己的兴趣&#xff0c;慢慢的逐步走到了前端。我想现在也是时候把前端搞好了&#xff0c;前端有几个作用&#xff1a; 1 对外可以作为广告。技术最终还是要考虑变现的。2 与外部协同。有很多工作是需要外部…

关于穿越机FPV视频果冻效应的讨论

关于穿越机FPV视频果冻效应的讨论1. 名词定义2. 摄像原理2.1 快门分类2.2 卷帘拍摄3. 产生原因4. 解决方法4.1 振动出处4.2 软件方法(辅助作用)4.3 硬件方法(直接办法)5. F450试验机遇到的问题5.1 现象5.2 测试5.3 减震改善5.4 其他改善5.5 初步结论5.6 改进方向6. 总结7. 参考…