【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) next

Breakpoint 1, main () at testSum.c:7
7			sum+=i;
(gdb) p sum
$2 = 0
(gdb) next
Hardware watchpoint 2: sum

Old value = 0
New value = 1
main () at testSum.c:5
5		for(i=0;i<=50;i++)
(gdb) p sum
$3 = 1
(gdb) step

Breakpoint 1, main () at testSum.c:7
7			sum+=i;
(gdb) p sum
$4 = 1
(gdb) step 
Hardware watchpoint 2: sum

Old 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)

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

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

相关文章

List(CS61B学习记录)

问题引入 上图中&#xff0c;赋给b海象的weight会改变a海象的weight&#xff0c;但x的赋值又不会改变y的赋值 Bits 要解释上图的问题&#xff0c;我们应该从Java的底层入手 相同的二进制编码&#xff0c;却因为数据类型不同&#xff0c;输出不同的值 变量的声明 基本类型…

使用Git将代码上传至代码托管平台GitCode

使用像GitLbi、GitHub、Gitee等代码托管平台用于版本控制非常滴方便&#xff0c;能够跟踪代码的变化和历史记录&#xff0c;方便管理和回滚&#xff0c;还允许多个开发者同时在一个项目上进行开发和协作&#xff0c;提高团队协作效率。 这些平台的代码托管和上传方式都大同小异…

MongoDB开启事务

MongoDB开启事务 配置单节点。到路径C:\Program Files\MongoDB\Server\4.0\bin 使用记事本以管理员权限打开文件mongod.cfg添加如下配置&#xff1a; replication:replSetName: rs02. 重启MongoDB服务 3. 重启后执行命令 rs.initiate()

java集合题库详解

1. Arraylist与LinkedList区别 可以从它们的底层数据结构、效率、开销进行阐述哈 ArrayList是数组的数据结构&#xff0c;LinkedList是链表的数据结构。 随机访问的时候&#xff0c;ArrayList的效率比较高&#xff0c;因为LinkedList要移动指针&#xff0c;而ArrayList是基于索…

【嵌入式高级C语言】10:C语言文件

文章目录 1 文件的概述1.1 文件分类&#xff08;存储介质&#xff09;1.2 磁盘文件分类&#xff08;存储方式&#xff09;1.3 二进制文件和文本文件的区别 2 文件缓冲区3 文件指针4 文件的API4.1 打开文件4.2 关闭文件4.3 重新定位流4.3.1 fseek4.3.2 ftell4.3.3 rewind 4.4 字…

基于SpringBoot的快递配送规划系统的设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 Spring Boot框架 3 1.2 Vue框架 4 1.4 Bootstrap框架 4 1.5 JQuery技术 5 1.6 Ajax技术 5 1.7 ECharts 5 1.8 MySQL 6 1.9本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 非功能需求 10 2.3 本章小结 10 3 系统设计 11 3.1 …

如何发布新华网稿件,新华网报价多少钱?

在当今信息爆炸的时代&#xff0c;媒体的重要性不言而喻。而作为国内最具影响力的媒体之一&#xff0c;新华网更是备受关注。那么&#xff0c;作为一名公关从业者或者自媒体人士&#xff0c;如何能够在媒介多多网成功发布新华网的稿件呢&#xff1f;接下来&#xff0c;我们就来…

基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 假设一个收集轨道&#xff0c;上面有5个采集堆&#xff0c;这5个采集堆分别被看作一个4*20的矩阵&#xff08;下面只有4*10&#xff09;&#xff0c;每个模块&…

C语言学习--练习3(贪心)

目录 贪心算法 1. 两数对之间的最大乘积差 2.三角形的最大周长 3.数组拆分 4.救生艇 5.发送饼干 6.摆动数组 贪心算法 概念定义 所谓贪心&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上进行考虑&#xff0c;算法得到的是在某种…

300分钟吃透分布式缓存-26讲:如何大幅成倍提升Redis处理性能?

主线程 Redis 自问世以来&#xff0c;广受好评&#xff0c;应用广泛。但相比&#xff0c; Memcached 单实例压测 TPS 可以高达百万&#xff0c;线上可以稳定跑 20~40 万而言&#xff0c;Redis 的单实例压测 TPS 不过 10~12 万&#xff0c;线上一般最高也就 2~4 万&#xff0c;…

Microsoft Copilot 好像能把论文配图看明白了

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Microsoft Copilot 好像能把论文配图看明白了&#xff0c;下面是两个案例。 请用学术风格详细描述您的研究论文中的这幅配图。在描述时&#xff0c;请尽可能准确地阐述图片的主要元素、颜色、形状、大…

如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中

1、第一步可以直接在pycharm项目中创建jupyter notebook文件 2、假若想要切换成pytorch环境做实验例子&#xff0c;会发现报这个错误 Jupyter server process exited with code 1 C:\Users\12430\.conda\envs\pytorch3.11\python.exe: No module named jupyter在这里&#xff…

推理判断-聂佳-判读4-定义判断

知识点讲解 考点1 快速识别有效信息 考点2 同构选项排除 题目 考点1 快速识别有效信息 考点2 同构选项排除 总结

linuxOPS基础_操作系统概述

计算机发展史 第一台计算机是1946 年2 月14 日诞生日&#xff0c;第一台名称ENIAC。体积一间屋子的大小&#xff0c;重量高达28t。 第一代&#xff1a;1946 – 1958 > 12 年 &#xff08;电子管&#xff09; 第二代&#xff1a;1958 – 1964 > 6 年 &#xff08;晶体管…

kafka(三)springboot集成kafka(1)介绍

基于kafka新版本 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency> </dependencies> 一、kafkaProducer 1、介绍…

HTML 学习笔记(九)颜色值和长度单位

一、颜色 1.通过RGB值来设置颜色 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>table</title&…

【Linux】线程同步与生产消费者问题

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;CP问题&#x1f449;&#x1f3fb;互斥…

c语言,大宗撮合交易中心系统核心模块代码

撮合交易系统&#xff08;Matching System&#xff09;常用于大宗交易&#xff0c;如股票、期货等市场&#xff0c;它负责根据买卖双方的报价和数量&#xff0c;自动撮合成交。撮合系统的核心模块通常包括订单管理、价格计算和撮合逻辑等部分。 由于撮合系统的实现复杂且依赖于…

【C++ 学习】拷贝构造你了解多少?

文章目录 1. 拷贝构造的引入2. 拷贝构造的引用场景 1. 拷贝构造的引入 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用&#xff1b; 特征&#xff1a; ① …

集合实现类研究底层(部分):手撕ArrayList底层源码、手撕LinkedList底层源码、手写单向链表和双向链表

day26上 集合框架图 标绿已经学习底层&#xff0c;深入底层主要是研究实现类底层 继承关系图 手撕ArrayList底层源码 ps:研究添加元素的过程 思路&#xff1a; 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程 提升&#xff1a…