当前位置: 首页 > news >正文

Linux文件编译

目录

一、GCC编译

1.直接编译

2.分步编译

预处理:

 编译:

汇编:

链接:

3.多文件编译

4.G++

二、Make 

1.概述

 2.使用步骤

3.makefile创建规则 

3.1一个基本规则 

3.2两个常用函数

 4.示例文件

 三、GDB

示例:

基本指令:


一、GCC编译

我们都知道想要实现一个程序首先需要写好代码让其能运行起来,那么写出来的.c文件是如何被编译出来的呢?

1.直接编译

首先将程序直接编译为可执行文件可以通过Linux中的GCC编译器。

GCC(是一套广泛使用的编译器工具集,由 GNU 项目开发和维护。它支持多种编程语言,包括 C、C++、Objective-C、Fortran、Go 和其他语言。GCC 提供了编译、链接和优化等功能,可以将源代码转换为可执行文件或库。

 gcc name.c:已经写好.c文件想生成执行文件,可直接用指令实现,会生成一个name.out文件,

输入指令"./name.out" 文件就会执行

2.分步编译

那么GCC是如何实现这个原理的呢?

预处理:

C 编译器对各种预处理命令进行处理,包括头文件包含、宏定义的扩展、条件编译的选择等;

gcc -E name.c -o name.i:对c程序文件进行预处理得到.i预处理文件

 编译:

将预处理得到的源代码文件进行语法词法分析,“翻译转换”得到机器语言的汇编文件;

gcc -S name.i:通过编译得到.s 汇编文件 (如果是c文件,会进行预处理+编译)

汇编:

将汇编代码翻译成了机器码,但是还不可以运行;

gcc -c name.s:通过汇编得到 hello.o 机器码文件 (如果是c文件,会进行预处理+编译+汇编)

链接:

处理可重定位文件,把各种符号引用转换成为可执行文件中的合适信息,通常是虚拟地址;

gcc name.o -o name:通过链接得到 a.out 可执行文件 (如果是c文件,进行完整编译步骤)

3.多文件编译

首先可以创建两个文件,一个是a.c文件

#include<stdio.h>
int main()
{printf("hello,world!\n");test();return 0;
}

 再创建一个文件用来存储外部函数

#include<stdio.h>void test()
{printf("test\n");
}

如果文件有更新,那么两个文件都需要重新编译

4.G++

g++:这是 GCC 中的 C++ 编译器。它将 C++ 源代码文件(通常以 .cpp 或 .cc 扩展名)作为输入,并生成可执行文件。与 gcc 相比,g++ 在编译 C++ 代码时会自动链接 C++ 的标准库。可以理解为一个是对C语言的编译,一个是对C++的编译

二、Make 

1.概述

make 是一个命令工具,它解释Makefile 中的指令。在Makefile 文件中述了整个工程所有文件的编译顺序、编译规则。

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若千个目录中,Makefile
定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译
,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,也可以执行操作系统的命令

 如果是单独文件编译可以直接用make name就可以生成执行文件。

 2.使用步骤

  1. 创建Makefile:在项目根目录下创建一个名为Makefile的文本文件。Makefile中包含了构建项目所需的规则和命令。
  2. 定义规则:Makefile中的规则由目标文件、依赖文件和构建命令组成。目标文件是需要构建的文件,依赖文件是构建目标文件所需的文件,构建命令是用于生成目标文件的命令。
  3. 编写构建命令:在Makefile中为每个规则编写构建命令。构建命令可以是任意可执行的命令或脚本,用于生成目标文件。
  4. 运行Make:在终端或命令提示符中,进入到项目根目录,并执行make命令。Make工具会读取Makefile,并根据规则和依赖关系自动构建项目。

3.makefile创建规则 

3.1一个基本规则 

目标:依赖条件(可以设置多个依赖条件)

        命令

target: dependenciescommand1command2...

3.2两个常用函数

$(wildcard pattern):

这个函数用于匹配指定模式的文件,并返回符合模式的文件名列表。模式可以包含通配符,如*和?。该函数将返回一个字符串,其中包含匹配的文件名列表,每个文件名之间用空格分隔。例:

src = $(wildcard *.c)

在这个示例中,$(wildcard *.c)会返回当前目录中所有以.c为扩展名的文件,将其赋值给变量src。

$(patsubst 参数1,参数2,参数3):

这个函数用于在给定的文本中,将符合指定模式的部分替换为指定的内容。模式可以包含通配符,如%,用于匹配任意字符。例:

objects := $(patsubst %.c, %.o, $(src))


在这个示例中,假设src变量包含一些.c文件的文件名列表。使用$(patsubst %.c, %.o, $(src))将替换文件名的扩展名,将.c替换为.o,并将结果赋值给变量objects。

3.3三个自动变量

$@

在规则的命令中,表示规则中的目标。例:

target: dependencygcc -o $@ $<

 在这个示例中,$@将被替换为目标文件的名称。

$^

在规则的命令中,表示所有依赖条件。例:

target: dependency1 dependency2gcc -o $@ $^

在这个示例中,$^将被替换为所有依赖文件的列表,即dependency1 dependency2。 

$<: 在规则的命令中,表示第一个依赖条件。例:

target: dependencygcc -o $@ $<

在这个示例中,$<将被替换为第一个依赖文件的名称。 

 4.示例文件

# 编译器设置
CC := gcc
CFLAGS := -Wall -Wextra -g# 目标文件
TARGET := program# 源文件列表
SRCS := main.c utils.c# 生成目标
$(TARGET): $(SRCS)$(CC) $(CFLAGS) -o $@ $^# 清理生成的文件
clean:rm -f $(TARGET).PHONY: clean
  • CC:定义编译器的变量,这里使用gcc作为默认的编译器。
  • CFLAGS:定义编译选项的变量,这里设置了一些常用的编译选项,如-Wall和-Wextra用于开启更多的警告信息,-g用于生成调试信息。
  • TARGET:定义目标文件的变量,这里设置为program。
  • SRCS:定义源文件的变量,这里列出了main.c和utils.c。
  • $(TARGET): $(SRCS):这是一个生成目标的规则,指定了$(SRCS)作为依赖文件,当依赖文件发生变化时,执行后续的命令将源文件编译链接成目标文件。
  • $(CC) $(CFLAGS) -o $@ $^:这是生成目标的命令,$(CC)和$(CFLAGS)分别代表编译器和编译选项,$@代表目标文件名,$^代表所有的依赖文件。
  • clean::这是一个清理目标文件的规则,指定了clean作为伪目标。
  • rm -f $(TARGET):这是清理目标文件的命令,使用rm -f命令删除目标文件。
  • .PHONY: clean:这个声明用于指示clean是一个伪目标,而不是一个实际的文件。

 关于Makefile需要多加练习,对于多文件编译是很有用的。Linux环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是个合格的专业程序员,至少不能称得上是 Unix 程序员。

 三、GDB

示例:

使用gcc编译时加上g选项可以得到调试表

#include<stdio.h>
void my_print(int i)
{printf("打印第%d次\n",i);
}
int main(){int i = 0;while(i < 10) {i++;my_print(i);}return 0;
}

例如:

  • gcc -g main.c
  • gdb ./a.out

基本指令:

  • list/l或list[数字]: 列出源码。加数字,在指定行号位置附近显示
  • break/b 或 break [number]: b 20   在20行位置设置断点
  • d/delete:断点编号 删除断点
  • run/r: 运行程序
  • start: 运行程序(到主函数停止)
  • n/next:下一条指令 (会越过函数)
  • s/step:下一条指令 (会进入函数)
  • p/print[变量名]:查看变量的值
  • continue/c:继续执行断点后续指令
  • finish:结束当前函数调用
  • q/quit:退出 gdb 当前调试 

 上面只是GDB的基本用法,如果想更深入的学习需要自己查阅一下资料。

相关文章:

Linux文件编译

目录 一、GCC编译 1.直接编译 2.分步编译 预处理&#xff1a; 编译&#xff1a; 汇编&#xff1a; 链接&#xff1a; 3.多文件编译 4.G 二、Make 1.概述 2.使用步骤 3.makefile创建规则 3.1一个基本规则 3.2两个常用函数 4.示例文件 三、GDB 示例&#xff1a;…...

homeword_day1

第一章 命名空间 一&#xff0e;选择题 1、编写C程序一般需经过的几个步骤依次是&#xff08; B &#xff09; A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据…...

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…...

论文阅读:Learning Lens Blur Fields

这篇文章是对镜头模糊场进行表征学习的研究&#xff0c;镜头的模糊场也就是镜头的 PSF 分布&#xff0c;镜头的 PSF 与物距&#xff0c;焦距&#xff0c;光学系统本身的像差都有关系&#xff0c;实际的 PSF 分布是非常复杂而且数量也很多&#xff0c;这篇文章提出用一个神经网络…...

SpringBoot整合Knife4j接口文档生成工具

一个好的项目&#xff0c;接口文档是非常重要的&#xff0c;除了能帮助前端和后端开发人员更快地协作完成开发任务&#xff0c;接口文档还能用来生成资源权限&#xff0c;对权限访问控制的实现有很大的帮助。 这篇文章介绍一下企业中常用的接口文档工具Knife4j&#xff08;基于…...

爬虫(三)

1.JS逆向实战破解X-Bogus值 X-Bogus:以DFS开头&#xff0c;总长28位 答案是X-Bogus,因为会把负载里面所有的值打包生成X-Boogus 1.1 找X-Bogus加密位置&#xff08;请求堆栈&#xff09; 1.1.1 绝招加高级断点&#xff08;日志断点&#xff09; 日志断点看有没有X-B值 日志…...

03 动力云客项目之登录功能后端实现

1 准备工作 1.1 创建项目 使用Spring initializr初始化项目 老师讲的是3.2.0, 但小版本之间问题应该不大. 1.2 项目结构 根据阿里巴巴Java开发手册确定项目结构 1.3 分层领域模型 【参考】分层领域模型规约&#xff1a; • DO&#xff08;Data Object&#xff09;&am…...

时光峰峦文物璀璨,预防性保护筑安全

在璀璨的历史长河中&#xff0c;珍贵文物如同时间的印记&#xff0c;承载着过往的辉煌。《人文山水时光峰峦——多彩贵州历史文化展》便是这样一场文化的盛宴&#xff0c;汇聚了众多首次露面的宝藏。然而&#xff0c;文物的保存对环境要求极为苛刻&#xff0c;温湿度波动都可能…...

Redis面试题43

人工智能在未来会有哪些可能的发展趋势&#xff1f; 答&#xff1a;人工智能在未来将继续迎来许多可能的发展趋势&#xff0c;以下是一些可能的方向&#xff1a; 更强大的算法和模型&#xff1a;人工智能算法和模型将不断改进和优化&#xff0c;为更复杂的数据和问题提供更强大…...

Redis -- list列表

只有克服了情感的波动&#xff0c;才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…...

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)

1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数&#xff0c;从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理速度。此外&…...

神经网络 | 基于多种神经网络模型的轴承故障检测

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要源自《第二届全国技能大赛智能制造工程技术项目比赛试题&#xff08;样题&#xff09; 模块 E 工业大数据与人工智能应用》&#xff0c;基于给出的已知轴承状态的振动信号样本&#xff0c;对数据进行分析&#xff0c;建…...

matplot画3D图的时候报错

使用matplot画3D图的时候&#xff0c;报这个错。 ERROR: Could not find a version that satisfies the requirement mpl_toolkits (from versions: none) ERROR: No matching distribution found for mpl_toolkits 要使用升级命令升级matplot而不是安装 pip install --upgr…...

如何使用LNMP让网站顺利工作?

如何使用LNMP让网站顺利工作&#xff1f; 1. Nginx的安装和部署 2. nginxphpmysql 3. nginx php-fpm安装配置 4. Nginx配置性能优化的方法 5. 如何使用Nginx实现限制各种恶意访问...

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画局部编辑重绘,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…...

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测 目录 多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-LSSVM卷积神经…...

使用NLTK进行自然语言处理:英文和中文示例

Natural Language Toolkit&#xff08;NLTK&#xff09;是一个强大的自然语言处理工具包&#xff0c;提供了许多有用的功能&#xff0c;可用于处理英文和中文文本数据。本文将介绍一些基本的NLTK用法&#xff0c;并提供代码示例&#xff0c;展示如何在英文和中文文本中应用这些…...

学习Spring的第十六天

AOP底层两种生成Proxy的方式 我来解释这两种方式 1 目标类有接口 , 调用JDK的动态代理实现 2 目标类没有接口 , 用Cglib实现 , 即生成目标类的子类 , 来实现动态代理 , 所以要求目标类不能时final修饰的 . (若有接口 , 也可用Cglib方式实现 , 需要手动配置<aop: config pr…...

学习笔记-01

学习笔记记录了我在学习官方文档过程中记的要点&#xff0c;可以参考学习。 go build *.go 文件 编译 go run *.go 执行 go mod init 生成依赖管理文件 gofmt -w *.go 格式换名称的大小写用来控制方法的可见域主方法及包命名规范 package main //注意package的命名&#xff0…...

opensatck中windows虚拟机CPU核数显示异常问题处理

文章目录 一、问题描述二、元数据信息三、以32核的实例模版为例3.1 单槽位32核3.2 双槽位32核 总结 一、问题描述 openstack创建windows虚拟机的时候&#xff0c;使用普通的实例模版会出现CPU数量和实例模版不一致的问题。需要定制元数据才可以正常显示。 帖子&#xff1a;htt…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...