【编译】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

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

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

相关文章

点播播放器如何自定义额外信息(统计信息传值)

Web播放器支持设置观众信息参数&#xff0c;设置后在播放器上报的观看日志中会附带观众信息&#xff0c;这样用户就可以通过管理后台的统计页面或服务端API来查看特定观众的视频观看情况了。 播放器设置观众信息参数的代码示例如下&#xff1a; <div id"player"…

加利福尼亚大学|3D-LLM:将3D世界于大规模语言模型结合

来自加利福尼亚大学的3D-LLM项目团队提到&#xff1a;大型语言模型 (LLM) 和视觉语言模型 (VLM) 已被证明在多项任务上表现出色&#xff0c;例如常识推理。尽管这些模型非常强大&#xff0c;但它们并不以 3D 物理世界为基础&#xff0c;而 3D 物理世界涉及更丰富的概念&#xf…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块,文件权限修改

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…

Java中的代理模式

Java中的代理模式 1. 静态代理JDK动态代理CGLib动态代理 1. 静态代理 接口 public interface ICeo {void meeting(String name) throws InterruptedException; }目标类 public class Ceo implements ICeo{public void meeting(String name) throws InterruptedException {Th…

【信号去噪和正交采样】流水线过程的一部分,用于对L波段次级雷达中接收的信号进行降噪(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

计算机网络——应用层

文章目录 **1 网络应用模型****2 域名系统DNS****3 文件传输协议FTP****4 电子邮件****4.1 电子邮件系统的组成结构****4.2 电子邮件格式与MIME****4.3 SMTP和POP3** **5 万维网WWW****5.1 HTTP** 1 网络应用模型 客户/服务器模型 C/S 服务器服务于许多来自其他称为客户机的主…

uniapp跨域解决

uniapp跨域解决 跨域是什么 跨域指的是浏览器不能执行其他网站的脚本&#xff0c;当一个网页去请求另一个域名的资源时&#xff0c;域名、端口、协议任一不同&#xff0c;就会存在跨域。跨域是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 报错…

Spring AOP 中,切点有多少种定义方式?

在 Spring AOP 中&#xff0c;我们最常用的切点定义方式主要是两种&#xff1a; 使用 execution 进行无侵入拦截。使用注解进行拦截。 这应该是是小伙伴们日常工作中使用最多的两种切点定义方式了。但是除了这两种还有没有其他的呢&#xff1f;今天松哥就来和大家聊一聊这个话…

【C语言初阶(20)】调试练习题

文章目录 前言实例1实例2 前言 在我们开始调试之前&#xff0c;应该有个明确的思路&#xff1b;程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。这些东西在调试之前都需要先确认下来&#xff0c;不然自己都不知道自己在调试个什么东西…

FFmpeg aresample_swr_opts的解析

ffmpeg option的解析 aresample_swr_opts是AVFilterGraph中的option。 static const AVOption filtergraph_options[] {{ "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,{ .i64 AVFILTER_THREAD_SLICE }, 0, INT_MA…

二十三种设计模式第二十篇--备忘录模式

备忘录模式&#xff0c;备忘录模式属于行为型模式。它允许在不破坏封装的情况下捕获和恢复对象的内部状态。保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;该模式通过创建一个备忘录对象来保存原始对象的状态&#xff0c;并将其存储在一个负责管理备…

使用adb通过电脑给安卓设备安装apk文件

最近碰到要在开发板上安装软件的问题&#xff0c;由于是开发板上的安卓系统没有解析apk文件的工具&#xff0c;所以无法通过直接打开apk文件来安装软件。因此查询各种资料后发现可以使用adb工具&#xff0c;这样一来可以在电脑上给安卓设备安装软件。 ADB 就是连接 Android 手…

测试libcurl库的demo时,报错 curl_easy_perform() failed: SSL connect error

系统&#xff1a;麒麟V10 arm roothg-TR3250:/home/cur765/curl-7.65.3/docs/examples# cat /etc/os-release NAME"Kylin" VERSION"银河麒麟桌面操作系统(国防版)V10" VERSION_US"Kylin Linux Desktop (GFB)V10" IDkylin ID_LIKEdebian PRETT…

CloudDriver一款将各种网盘云盘挂在到电脑本地变成本地磁盘的工具 教程

平时我们的电脑可能由于大量的文件资料之类的导致存储空间可能不够&#xff0c;所以我们可以选择将网盘我们的本地磁盘用来存放东西。 CloudDrive 是一款可以将 115、阿里云盘、天翼云盘、沃家云盘、WebDAV 挂载到电脑中&#xff0c;成为本地硬盘的工具&#xff0c;支持 Window…

职工管理系统(code)

首先创建头文件、源文件&#xff0c;再编程。&#xff08;B站黑马程序员视频笔记&#xff09; 一、头文件.h 1、boss.h #pragma once #include<iostream> using namespace std; #include "worker.h"//老板类 class Boss :public Worker { public://构造函数B…

最优化方法

一. 图论 1.最小生成树 图的生成树是它的一颗含有其所有顶点的无环连通子图,一 幅加权图的最小生成树(MST)是它的一颗权值(树中的所有边的权值之和) 最小的生成树 • 适用场景&#xff1a;道路规划、通讯网络规划、管道铺设、电线布设等 题目数据 kruskal算法 稀疏图&#x…

【Git系列】了解什么是版本控制

&#x1f433;了解什么是版本控制 &#x1f9ca;1. 什么是版本控制&#x1f9ca;2. 为什么要有版本控制&#x1f9ca;3. 常见的版本控制工具&#x1f9ca;4. 版本控制分类&#x1fa9f;4.1 本地版本控制&#x1fa9f;4.2 集中版本控制&#x1fa9f;4.3 分布式版本控制 学习git之…

Elasticsearch和Kibana的安装及验证

金翅大鹏盖世英&#xff0c;展翅金鹏盖世雄。 穿云燕子锡今鸽&#xff0c;踏雪无痕花云平。 ---------------- 2023.7.31.101 ----------------- 本文密钥&#xff1a;365 Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎&#xff0c;常用来进行全文检索、…

redis 第三章

目录 1.主从复制 2.哨兵 3.集群 4.总结 1.主从复制 结果&#xff1a; 2.哨兵 3.集群 4.总结 通过集群&#xff0c;redis 解决了写操作无法负载均衡&#xff0c;以及存储能力受到单机限制的问题&#xff0c;实现了较为完善的高可用方案。