Linux文件编译

news2024/11/26 19:25:52

目录

一、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: dependencies
    command1
    command2
    ...

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: dependency
    gcc -o $@ $<

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

$^

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

target: dependency1 dependency2
    gcc -o $@ $^

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

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

target: dependency
    gcc -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的基本用法,如果想更深入的学习需要自己查阅一下资料。

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

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

相关文章

STM32单片机的基本原理与应用(六)

串口测试实验 基本原理 在串口实验中&#xff0c;是通过mini_USB线搭建终端与电脑端&#xff08;也可称终端&#xff0c;为做区分称电脑端&#xff09;的“桥梁”&#xff0c;电脑端的串口调试助手通过mini_USB线向终端发送信息&#xff0c;由CH340芯片将USB接口进行转换&…

PyTorch 2.2 中文官方教程(十五)

&#xff08;beta&#xff09;计算机视觉的量化迁移学习教程 原文&#xff1a;pytorch.org/tutorials/intermediate/quantized_transfer_learning_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 提示 为了充分利用本教程&#xff0c;我们建议使用这个C…

linux下的预编译、编译、汇编、连接,生成单独文件,感受编译过程

linux下的预编译、编译、汇编、连接&#xff0c;生成单独文件。首先需要确认系统安装了gcc编译器&#xff0c;输入gcc -v或者g -v&#xff0c;如果能看到版本号等信息就是已经存在了&#xff0c;如图&#xff08;centos7&#xff09;&#xff1a; 然后随便vim产生一个.cpp文件&…

什么是前端工程化,请举例说明

前端工程化 前端工程化的定义为什么需要前端工程化前端工程化的核心概念 模块化开发&#xff1a;组件化开发&#xff1a;规范化开发&#xff1a;自动化开发&#xff1a;持续集成 前端工程化的主要工具前端工程化的应用总结&#xff1a; 前端工程化 前端工程化的定义 前端工程…

zabbix监控mariadb数据库

zabbix监控mariadb数据库 1.创建监控用户及授权 [rootchang ~]# mysql -uroot -p123qqq.A MariaDB [(none)]> CREATE USER monitor% IDENTIFIED BY 123qqq.A; MariaDB [(none)]> GRANT REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW ON *.* TO monitor%; Maria…

使用最大边界相关算法处理文章自动摘要

一、需求背景 对于博客或者文章来说&#xff0c;摘要是普遍性的需求。但是我们不可能让作者自己手动填写摘要或者直接暴力截取文章的部分段落作为摘要&#xff0c;这样既不符合逻辑又不具有代表性&#xff0c;那么&#xff0c;是否有相关的算法或者数学理论能够完成这个需求呢&…

【高质量精品】2024美赛B题22页word版高质量半成品论文+多版保奖思路+数据+前四问思路代码等(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;获取完整论文&#xff01;&#xff01; B 题整体模型构建 1. 潜水器动力系统失效&#xff1a;模型需要考虑潜水器在无推进力情况下的行为。 2. 失去与主船通信&#xff1a;考虑无法从主船接收指令或发送位置信息的情况。…

基于若依的ruoyi-nbcio流程管理系统自定义业务实现一种简单的动态任务标题需求

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

深度学习介绍

对于具备完善业务逻辑的任务&#xff0c;大多数情况下&#xff0c;正常的人都可以给出一个符合业务逻辑的应用程序。但是对于一些包含超过人类所能考虑到的逻辑的任务&#xff0c;例如面对如下任务&#xff1a; 编写一个应用程序&#xff0c;接受地理信息、卫星图像和一些历史…

【51单片机】开发板&开发软件(Keil5&STC-ISP)简介&下载安装破译传送门(1)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

【目标跟踪】相机运动补偿

文章目录 一、前言二、简介三、改进思路3.1、状态定义3.2、相机运动补偿3.3、iou和ReID融合3.4、改进总结 四、相机运动补偿 一、前言 目前 MOT (Multiple Object Tracking) 最有效的方法仍然是 Tracking-by-detection。今天给大家分享一篇论文 BoT-SORT。论文地址 &#xff0…

wireshark分析数据包:追踪流

打开追踪流的界面 方法 1 方法 2 选中数据包&#xff0c;右键弹出菜单 说明&#xff1a; 流内容的显示顺序和它在网络上出现的顺序相同。不可打印的字符被点代替。从客户端到服务器的流量被标记为红色&#xff0c;而从服务器到客户端的流量被标记为蓝色。这些颜色可以通过下…

No matching client found for package name ‘com.unity3d.player‘

2024年2月5日更新 下面的一系列操作最终可能都无用&#xff0c;大致这问题出现原因是我在Unity采用了Android方式接入Firebase&#xff0c;而Android接入实际上和Unity接入方式有配置上的不一样&#xff0c;我就是多做了几步操作如下。https://firebase.google.com/docs/androi…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…

用Jmeter进行接口测试

web接口测试工具&#xff1a; 手工测试的话可以用postman &#xff0c;自动化测试多是用到 Jmeter&#xff08;开源&#xff09;、soupUI&#xff08;开源&商业版&#xff09;。 下面将对前一篇Postman做接口测试中的接口用Jmeter来实现。 一、Jmeter 的使用步骤 打开Jme…

【vscode】windows11在vscode终端控制台中打印console.log()出现中文乱码问题解决

1. 问题描述 在前端开发过程中使用vscode编写node.js&#xff0c;需要在控制台中打印一些中文信息&#xff0c;但是一直出现中文乱码问题&#xff0c;英文和数字都显示正常。在网上试了很多设置的办法&#xff0c;最终找到windos11设置中解决。 2. 原因 首先打开控制台&…

通过html2canvas和jsPDF将网页内容导出成pdf

jsPDF参考&#xff1a;https://github.com/parallax/jsPDF html2canvas参考&#xff1a;https://github.com/niklasvh/html2canvas 或者 https://html2canvas.hertzen.com 思路 使用html2canvas将选中DOM生成截图对象将截图对象借助jsPDF导出为PDF文件 代码 这是一个示例&a…

《幻兽帕鲁》解锁基地和工作帕鲁数量上限

帕鲁私服的游戏参数通常可通过配置文件 PalWorldSettings.ini 来进行修改&#xff0c;然而这个配置文件有个别参数对游戏不生效&#xff0c;让人很是头疼。没错&#xff01;我说的就是终端最大的帕鲁数量&#xff01; 其实还有另外一种更加高级的参数修改方式&#xff0c;那就…

C#实现坐标系转换

已知坐标系的向量线段AB&#xff0c;旋转指定角度后平移到达坐标AB 获取旋转角度以及新的其他坐标转换。 新建窗体应用程序CoordinateTransDemo&#xff0c;将默认的Form1重命名为FormCoordinateTrans&#xff0c;窗体设计如图&#xff1a; 窗体设计代码如下&#xff1a; 部分…

在windows下安装docker部署环境运行项目----docker-compose.yml

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01; 也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&…