【Linux】Linux C编程

gcc编译器

gcc [options] [filenames]

其中,options是编译器所需要的选项参数,filenames是文件名。

gcc编译过程

C语言编译过程一般可以分为预处理、编译、汇编、链接四个步骤。

1.预处理阶段

预处理阶段主要处理宏定义和include,并进行语法检查,最终生成预处理文件

gcc 通过-E参数调用预处理程序 cpp,完成预处理工作。- o 参数用于指定输出文件

gcc -E -o zp.i zp.c

 2.编译阶段

在编译阶段,编译器将对源代码进行词法分析、语法分析、代码优化等操作,最后生成汇编代码。这是整个过程中最重要的一步,因此也常把整个过程称为编译。

通过 - S 参数可使gcc在完成编译后停止,生成后缀 . s 的汇编文件

gcc -S -o zp.s zp.c

3.汇编阶段

汇编阶段使用汇编器对汇编代码进行处理,生成机器语言代码,并保存在后缀为.o的目标文件中。当程序由多个代码文件构成时,每个文件都要先完成汇编工作,在生成.o目标文件后,才能进入下一步链接工作。目标文件属于最终程序的某一部分,只是在链接之前还不能执行。

gcc 通过 -c 参数调用 as,完成汇编工作。

gcc -c -o zp.o zp.c

 4.链接阶段

链接阶段将所有的.o文件和需要的库文件链接成一个可执行文件。经过汇编的机器代码还不能直接运行。为了使操作系统能够正确加载可执行文件,文件中必须包含固定格式的信息头,当其与系统提供的启动代码链接起来时文件才能正常运行。这些都是由链接器来完成的。

gcc -o zp zp.c

gcc通过链接程序ld,完成链接工作。

链接阶段结束后将生成可执行文件,通过一下方式可运行该可执行程序。

./zp

完整过程演示

gcc -E hello.c -o hello.i#gcc 预处理
ls #确认预处理后生成的源代码文件hello.i

gcc -S hello.i -o hello.s  #gcc编译
ls  #确认已生成的汇编文件hello.s

gcc -c hello.s -o hello.o #gcc编译
ls  #确认已生成的二进制文件hello.o

gcc hello.o -o hello  #gcc链接
ls
file hello  #查看生成文件的信息
./hello     #执行该程序

简单的gcc用法

[qiang@localhost work]$ gcc hello.c  #gcc自动生成一个a.out可执行文件
[qiang@localhost work]$ ls
a.out  hello.c
[qiang@localhost work]$ ./a.out      #执行a.out
Hello gcc!
[qiang@localhost work]$ 

[qiang@localhost work]$ gcc hello.c -o hello
[qiang@localhost work]$ ls
hello  hello.c
[qiang@localhost work]$ ./hello
Hello gcc!

编译包含多个源文件的项目

1.编写源代码

1)hello.h文件

#ifndef  _HELLO_H
#define  _HELLO_H
void hello();
#endif

2)hello.c文件

#include "hello.h"
#include <stdio.h>
void hello(){printf("Hello,I'm zp!\n");
}

3)helloMain.c文件

#include "hello.h"
void main()
{ Hello();  
}

2.编译过程

gcc hello.c  hello.h  helloMain.c -o hello  #编译生成可执行文件

gdb调试

1.编写C语言源文件

#include <stdio.h>
int main()
{int i,sum=0;for(i=0;i<=50;i++){sum+=i;}printf("the sum is %d",sum);return 0;
}

2.使用gcc的-g选项编译文件

[qiang@localhost code]$ gcc -g testSum.c -o testSum
[qiang@localhost code]$ ls
testSum  testSum.c

3.使用gdb启动此文件调试

gdb testSum

gdb调试工具将gdb作为提示符,输入相应的gdb内部命令,即可进行调试。输入help命令可获取帮助信息输入quit命令,可以退出gdb。 

[qiang@localhost code]$ gdb testSum
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/qiang/code/testSum...done.
(gdb) 

 4.gdb常见内部命令的使用

1)使用  list 或 l命令查看程序的源代码。

list后面可以接行号,此时将显示当前文件以”行号“为中心的前后10行代码。

2) 输入run 命令运行此文件

3)使用break 7 命令在程序的第7行设置一个断点

4)使用run命令可查看设置断点后程序的运行情况。程序运行到断点处自动暂停

5)使用watch sum命令给sum变量设置一个监视点。使用 p sum 命令打印 sum 变量的值。

6)使用step 命令或者next 命令可以单步执行程序。单步执行数次后,使用p sum命令观察sum值的变化情况。

(gdb) step
5		for(i=0;i<=50;i++)
(gdb) nextBreakpoint 1, main () at testSum.c:7
7			sum+=i;
(gdb) p sum
$2 = 0
(gdb) next
Hardware watchpoint 2: sumOld value = 0
New value = 1
main () at testSum.c:5
5		for(i=0;i<=50;i++)
(gdb) p sum
$3 = 1
(gdb) stepBreakpoint 1, main () at testSum.c:7
7			sum+=i;
(gdb) p sum
$4 = 1
(gdb) step 
Hardware watchpoint 2: sumOld value = 1
New value = 3
main () at testSum.c:5
5		for(i=0;i<=50;i++)
(gdb) p sum
$5 = 3
(gdb) 

7)使用info b 命令可以查看当前所有断点和观测点的信息

使用info b n(n为断点编号)可以查看单个断点的信息 

8)使用d n 命令可以删除指定编号的断点,使用 d 命令可以删除所有断点。删除后再次使用info b命令查看断点的信息。

make编译

当源文件数量较多且具有复杂依赖时,就需要使用make工具来帮助我们进行管理。

在Linux操作系统环境下使用GNU的make工具能够比较方便地构建一个属于自己的工程,整个工程的编译只需要一个命令就可以完成编译链接。

在执行make命令时,需要提供Makefile 文件,make命令基于Makefile 文件,实现了一种自动化的编译机制。make命令通过解释Makefile 文件中的规则来编译所需要的文件和链接目标文件,进而实现自动维护编译工作。 

1)如果该工程还没有被编译过,那么所有C文件都要编译并被链接。

2)如果对该工程的某些C文件进行了修改,那么make过程将只编译被修改的C文件,并链接目标程序。

3)如果这个工程的头文件被更改了,那么需要编译引用了这几个头文件的C文件,并链接目标程序。

 Cpp学习笔记 ——4.make与Makefile - 知乎 (zhihu.com)

文件备份与压缩

快速上手Linux核心命令(九):文件备份与压缩 - 知乎 (zhihu.com)

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

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

相关文章

Luajit 2023移动版本编译 v2.1.ROLLING

文章顶部有编好的 2.1.ROLLING 2023/08/21版本源码 Android 64 和 iOS 64 luajit 目前最新的源码tag版本为 v2.1.ROLLING on Aug 21, 2023应该是修正了很多bug, 我是出现下面问题才编的. cocos2dx-lua 游戏 黑屏 并报错: [LUA ERROR] bad light userdata pointer 编…

flutter旋转动画,算法题+JVM+自定义View

在很多的博客或者书上&#xff0c;说有三种&#xff0c;除了上述的两种以外&#xff0c;还有一种是实现Callable接口。但是这种并不是&#xff0c;因为&#xff0c;我们检查JDK中Thread的源码&#xff0c;看它的注释&#xff1a; There are two ways to create a new thread o…

#QT(TCP网络编程-服务端)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;编写一个tcp服务端 QTcpsever QTcpsocket 3.记录&#xff1a; (1)先搭建界面 &#xff08;2&#xff09;服务端代码 a. pro QT core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c1…

Docker的安装跟基础使用一篇文章包会

目录 国内源安装新版本 1、清理环境 2、配置docker yum源 3、安装启动 4、启动Docker服务 5、修改docker数据存放位置 6、配置加速器 现在我们已经完成了docker的安装和初始配置。以下为基本测试使用 自带源安装的版本太低 docker官方源安装的话速度太慢了 所以本篇文…

CSS浮动实战,经典好文

零基础学web前端开发要怎么去学? 首先要学习的就是基础知识&#xff1a;html、css和JavaScript。HTML是内容&#xff0c;CSS是表现&#xff0c;JavaScript是行为。前端开发的门槛其实非常低&#xff0c;与服务器端语言先慢后快的学习曲线相比&#xff0c;前端开发的学习曲线是…

1909_Arm Cortex-M3编程模型

1909_Arm Cortex-M3编程模型 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) 编程模型的部分除了单独的核心寄存器描述之外&#xff0c;它还包含有关处理器模式和软件执行和堆栈的特权级别的信息。 处理器有两种模式&#xff0c;分别是线程模式和Handle…

运维知识点-hibernate引擎-HQL

HQL有两个主要含义&#xff0c;分别是&#xff1a; HQL&#xff08;Hibernate Query Language&#xff09;是Hibernate查询语言的缩写&#xff0c;它是一种面向对象的查询语言&#xff0c;类似于SQL&#xff0c;但不是去对表和列进行操作&#xff0c;而是面向对象和它们的属性…

动态规划(算法竞赛、蓝桥杯)--状态压缩DP蒙德里安的梦想

1、B站视频链接&#xff1a;E31 状态压缩DP 蒙德里安的梦想_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N12,M1<<N; bool st[N];//st[i]存储合并列的状态i是否合法 long long f[N][M];//f[i][j]表示摆放第i列&#xff0c;状态为…

R语言的数据类型与数据结构:向量、列表、矩阵、数据框及操作方法

R语言的数据类型与数据结构&#xff1a;向量、列表、矩阵、数据框及操作方法 介绍向量列表矩阵数据框 介绍 R语言拥有丰富的数据类型和数据结构&#xff0c;以满足各类数据处理和分析的需求。本文将分享R语言中的数据类型&#xff0c;包括向量、列表、矩阵、数据框等&#xff…

【数据结构】顺序表+链表

目录 1.顺序表 1.1初始化顺序表 1.2销毁顺序表 1.3检查容量并扩容 1.4把某个元素插入到下标为pos的位置 1.5头插和尾插 1.6删除下标为pos的元素 1.7头删和尾删 2.顺序表的问题及思考 3.链表 3.1链表的访问 3.2链表的增删查改 1.顺序表 顺序表的本质其实就是一个数组…

【SpringBoot3.x教程02】SpringBoot配置文件详解

前言&#xff1a;什么是配置文件 SpringBoot的配置文件是指用于定义和管理SpringBoot应用程序配置的文件。这些配置文件允许开发者调整和控制应用程序的行为&#xff0c;而无需改变代码。主要有两种格式的配置文件&#xff1a; 1、application.properties&#xff1a;这是一种使…

2.13计算机工作过程

2.三个级别的语言 1)机器语言。又称二进制代码语言&#xff0c;需要编程人员记忆每条指令的二进制编码。机器语言是计算机唯一可以直接识别和执行的语言。 2)汇编语言。汇编语言用英文单词或其缩写代替二进制的指令代码&#xff0c;更容易为人们记忆和理解。使用汇编语言编辑的…