当前位置: 首页 > 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…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...