【编译】gcc make cmake Makefile CMakeList.txt 区别

文章目录

    • 一 关系
    • 二 gcc
      • 2.1 编译过程
      • 2.2 编译参数
      • 2.3 静态库和动态库
        • 1 后缀名
        • 2 联系与区别
      • 2.4 GDB 调试器
        • 1 常用命令
    • 三 make、makefile
    • 四 cmake、cmakelist
      • 4.1 语法特性
      • 4.2 重要命令
      • 4.2 重要变量
      • 4.3 编译流程
      • 4.4 两种构建方式
    • 五 Vscode
      • 5.0 常用快捷键
      • 5.1 界面
      • 5.2 插件
      • 5.3 .vscode 文件夹
        • 1 launch.json
        • 2 task.json

一 关系

1 gcc是一种编译器。将源代码转为可执行文件。

当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大,所以出现了make工具。

2 make是一个批处理工具。在整个项目中管理编译过程。其依据是makefile文件。

3 makefile是一个文本文件用于指挥make。其中包含一系列规则和命令。make 工具通过读取 makefile 中的规则来确定需要重新编译哪些文件,以及执行哪些命令来完成编译过程。

makefile在一些简单的工程完全可以用人工手写,但是当工程非常大的时候,手写makefile也是非常麻烦的,并且如果换了个平台makefile又要重新修改。这时候就出现了Cmake工具。

4 cmake是一个跨平台构建工具。cmake可以更加简单的生成makefile文件给make用。

5 cmakelist是一个文本文件,用于指挥cmake

image-20230726151254616

参考网址:http://t.csdn.cn/iNMcN



二 gcc

安装

sudo apt update
sudo apt install build-essential gdb

2.1 编译过程

  • 预处理 -E .i 展开宏
  • 编译 -S .s c->汇编
  • 汇编 -c .o 汇编->二进制
  • 链接 -o bin文件

image-20230731165711403

2.2 编译参数

1 -g 带调试信息

2 -O2 优化源代码

3 -l -L 指定库文件 | 指定库文件路径

4 -I 指定头文件搜索目录

5 -Wall 打印警告信息

6 -w 关闭警告信息

7 -std=c++11 设置编译标准

8 -o 指定输出文件名

9 -D 定义宏

image-20230731165958597

image-20230731170020543

image-20230731170034849

2.3 静态库和动态库

1 后缀名

  • 静态库后缀名:.a
  • 动态库后缀名:.so

2 联系与区别

  • 静态库在编译时被链接到目标程序中,成为程序的一部分。优点是可执行文件运行时不依赖外部库。缺点是文件较大。
  • 动态库不会被复制到最终的可执行文件中,节省内存,兼容性问题。

2.4 GDB 调试器

  • 安装

    sudo apt update
    sudo apt install build-essential gdb
    
  • 编译时需要带-g

    gcc -g main.c -o main

1 常用命令

image-20230726212901303

image-20230726212915786

三 make、makefile

四 cmake、cmakelist

4.1 语法特性

image-20230728110412455

4.2 重要命令

# CMake最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)# 指定工程名为HELLOWORLD
project(HELLOWORLD)# 定义SRC变量,其值为sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径
include_directories(/usr/include/myincludefolder ./include)# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)# 通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})# 添加编译参数 -Wall -std=c++11 -O2
add_compile_options(-Wall -std=c++11 -O2)# 编译main.cpp生成可执行文件main
add_executable(main main.cpp)# 将hello动态库文件链接到可执行文件main
target_link_libraries(main hello)# 添加src子目录,src中需有一个CMakeLists.txt
add_subdirectory(src)# 定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)# 编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC})

image-20230731165308494

image-20230731165343782

image-20230731165410438

4.2 重要变量

image-20230731165534974

image-20230731165553971

4.3 编译流程

  • 1 编写CMakeLists.txt
  • 2 执行命令:cmake 路径,生成makefile
  • 3 执行命令:make

4.4 两种构建方式

image-20230731153412517

五 Vscode

5.0 常用快捷键

快捷键功能
行注释ctrl+/
块注释ctrl+shift+A
移动当前行alt+上/下
命令面板ctrl+shift+p
转到文件ctrl+p
转到行ctrl+g
打开终端ctrl+~
变量重命名F2
打开/关闭侧边栏ctrl+B
编辑器拆分ctrl+\
缩略图菜单栏:查看/外观
代码缩进ctrl+[/]
代码格式化ctrl+shift+I
在下方插入一行ctrl+enter
移到定义处F12
编辑区放大缩小ctrl+ -/+

5.1 界面

四大区:菜单栏、侧边栏、编辑区、状态栏

image-20230728095310489

5.2 插件

image-20230731164620130

5.3 .vscode 文件夹

1 launch.json

2 task.json

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

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

相关文章

使用 docker 一键部署 MySQL

目录 1. 前期准备 2. 导入镜像 3. 创建部署脚本文件 4. MySQL 服务器配置文件模板 5. 执行脚本创建容器 6. 后续工作 7. 基本维护 1. 前期准备 新部署前可以从仓库(repository)下载 MySQL 镜像,或者从已有部署中的镜像生成文件&#x…

Shell错误:/bin/bash^M: bad interpreter: No such file or directory

目录 错误原因和现象 解决方案 错误原因和现象 在执行shell脚本的时候,报错:/bin/bash^M: bad interpreter: No such file or directory。 是由于该脚本文件是在Windows平台编写,然后在MacOS平台中执行。 在Windows平台上文件是dos格式&…

STM32 SPI学习

SPI 串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。 SCK时钟信号由主机发出。 SPI接口主要应用在存储芯片。 SPI相关引脚:MOSI(输出数据线&#xff…

C语言学习笔记---数组篇章

C语言程序设计笔记---011 C语言数组1、一维数组的创建和初识化2、数组的初识化3、一维数组的使用3.1、一维数组在内存中的存储 4、二维数组的创建和初识化4.1、二维数组的使用4.1.1、打印二维数组的元素例程 4.2、二维数组在内存中的存储4.3、数组越界4.3.1、数组越界例程 4.4、…

深入了解 LoRaWAN® MAC 命令

本文深入探讨了用于 LoRaWAN 网络管理的 MAC 命令。它面向终端设备软件开发人员和使用 LoRa 构建设备的团队经理,这些设备实现了LoRaWAN 链路层规范 v1.0.4。本文帮助您了解不同类型的 MAC 命令、每个命令的用途以及如何解释这些命令。 已经使用LoRaMAC-Node™等软件来处理 MA…

C# Blazor 学习笔记(2):组件模板化/插槽

文章目录 前言组件模板为什么要组件模板不使用组件模板使用后 代码部分 和直接绑定数据有和区别? 前言 组件模板化我们在WPF经常遇到,这里将一下Blazor是如何解决的。 组件模板 为什么要组件模板 虽然组件化了之后,我们写代码的速度已经很…

1.netty介绍

1.介绍 是JBOSS通过的java开源框架是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络IO程序基于TCP,面向客户端高并发应用/点对点大量数据持续传输的应用是NIO框架 (IO的一层层封装) TCP/IP->javaIO和网络编程–>NIO—>Netty 2.应用…

Linux 新硬盘分区,挂载

在Linux系统中,当你插入新的硬盘时,你需要进行一些步骤来使系统识别并使用它。以下是一些常见的步骤: 确保硬盘已正确连接到计算机。检查硬盘的电源和数据线是否牢固连接。 打开终端或命令行界面。 运行以下命令来扫描新硬盘: s…

性能测试必备监控技能windows篇

前言 在手头没有专门的第三方监控时,该怎么监控服务指标呢?本篇就windows下监控进行分享,也是我们在进行性能测试时,必须掌握的。下面我们就windows下常用的三种监视工具进行说明: 任务管理器 资源监视器 性能监视器…

找样机素材,就上这5个网站,免费下载~

设计师经常需要用到各种样机模型来展示直接的作品,今天我就分享几个可以免费下载样机模型的网站,大家赶紧收藏起来! 菜鸟图库 https://www.sucai999.com/searchlist/3217.html?vNTYxMjky 菜鸟图库有多种类型的设计素材,像平面、…

Element-plus侧边栏踩坑

问题描述 el-menu直接嵌套el-menu-item菜单&#xff0c;折叠时不会出现文字显示和小箭头无法隐藏的问题&#xff0c;但是实际开发需求中难免需要把el-menu-item封装为组件 解决 vue3项目中嵌套两层template <template><template v-for"item in list" :k…

[ 容器 ] Docker 安全及日志管理

目录 Docker 容器与虚拟机的区别Docker 存在的安全问题Docker 架构缺陷与安全机制Docker 安全基线标准容器相关的常用安全配置方法限制流量流向镜像安全避免Docker 容器中信息泄露DockerClient 端与 DockerDaemon 的通信安全 容器的安全性问题的根源在于容器和宿主机共享内核。…

winform学习(1)------多窗口控制

在窗口中跳转到另外一个窗口&#xff0c;需要创建另外一个窗口的对象&#xff0c;然后通过窗口对象的show方法进行展示 这里展示了通过当前窗口的button按键来打开另外一个窗口 private void button1_Click(object sender, EventArgs e){Form2 form new Form2();form.Size n…

linux V4L2子系统——v4l2架构(1)之整体架构

概述 V4L&#xff08;Video for Linux&#xff09;是Linux内核中关于视频设备的API接口&#xff0c;涉及视频设备的音频和视频信息采集及处理、视频设备的控制。V4L出现于Linux内核2.1版本&#xff0c;经过修改bug和添加功能&#xff0c;Linux内核2.5版本推出了V4L2&#xff08…

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么&#xff1f; 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。…

单机版Antelope版本的OpenStack自动化安装

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 当前版本的支持安装单机版Antelope版本的OpenStack。部署脚本基于python3写的。操作系统基于Ubuntu 22.04.2 LTS。 一、基础配置。 1、安装操作系统&#xff0c;安装完成之后除了可上网&#xff0c;无需做任…

【shell】获取ping的时延数据并分析网络情况

网络情况经常让我们头疼&#xff0c;每次都需要手动在终端ping太麻烦了&#xff0c;不如写个脚本ping并将数据带上时间戳存入文件&#xff0c;然后也可以分析哪个时间段网络比较差。 创建一个demo.sh文件&#xff1a; #!/bin/bash # 清理日志 net_path"./network/"…

STM32 USB使用记录:HID类设备(后篇)

文章目录 目的基础说明项目构建与代码调整接收发送代码与测试示例链接报告描述符总结 目的 接上篇&#xff1a; 《STM32 USB使用记录&#xff1a;HID类设备&#xff08;前篇&#xff09;》 USB HID 类的设备有个比较大的好处是大部分时候接入主机中都是可以免驱使用的。这篇文…

高并发架构去重难?架构必备技能 - 布隆过滤器

系列文章目录 当Dubbo遇到高并发&#xff1a;探究流量控制解决方案 主从选举机制&#xff0c;架构高可用性的不二选择 高并发架构去重难&#xff1f;架构必备技能 - 布隆过滤器 系列文章目录前言一、布隆过滤器简介二、特性与应用场景三、参数定制四、java版本的Demo五、总结 …