【Linux】Linux C编程

news2024/9/24 19:15:04

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)

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

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

相关文章

腾轩科技传媒讲解企业怎样做整合营销推广才有效果

当今信息爆炸的时代&#xff0c;企业如何才能从浩渺的市场中脱颖而出&#xff0c;触达目标消费者&#xff0c;实现品牌与销售的双增长&#xff1f;腾轩科技传媒讲解的整合营销推广正是解决这一问题的关键所在。它不仅仅是一种营销策略&#xff0c;更是一种全新的思维方式&#…

全面分析vcruntime140_1.dll无法继续执行代码的处理方法,3分钟修复vcruntime140_1.dll

如果系统弹出一个错误警告&#xff0c;指出“vcruntime140_1.dll无法继续执行代码”&#xff0c;这通常意味着您的Windows系统中缺失了一个关键的文件&#xff0c;或者该文件已损坏。​vcruntime140_1.dll​是随Visual C Redistributable for Visual Studio 2015, 2017和2019提…

购物车下单实现思路【vue】

文章目录 1、购物车1.1 使用pinia来存储购物车的状态1.2 用户将商品加入购物车的时候 2、点击结算按钮3、封装支付 1、购物车 在购物车页面会有一个点 提示当前购物车内商品的数量购物车内商品的展示购物车内商品的选中 1.1 使用pinia来存储购物车的状态 state: () > ({//…

web游戏-飞机大战

H5小游戏源码、JS开发网页小游戏开源源码大合集。无需运行环境,解压后浏览器直接打开。有需要的,私信本人,发演示地址,可以后再订阅,发源码,含60+小游戏源码。如五子棋、象棋、植物大战僵尸、开心消消乐、扑鱼达人、飞机大战等等 <!DOCTYPE html> <html lang=&q…

lowcode-engine快速开始

https://lowcode-engine.cn/site/docs/guide/quickStart/intro 安装node 需要node 14.17.0 pnpm安装多个node教程 pnpm env add --global 14.17.0下载demo deomo地址 安装依赖包 切换nodejs版本 pnpm env use --global 14.17.0 node -v切换到demo-general&#xff0c;安…

学习java第一天(下载并配置环境+写第一个java程序)

一.安装 1.下载 直接去官网上选择与你电脑符合的版本下载 官网链接Java Archive Downloads - Java SE 8u211 and later &#xff08;拿我的为例 Windows x64版本&#xff09; ​ 2.然后安装好exe&#xff08;要让自己知道在哪&#xff09; 3.配置环境 大佬链接&#xff1…

特种车日常检修VR虚拟互动培训软件节省大量的教学资源和成本

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐融入了各行各业&#xff0c;其中特种车辆的养护教学也从中受益匪浅。VR虚拟仿真教学在特种车辆养护领域的应用&#xff0c;不仅创新了教学方式&#xff0c;还为提高学员的学习效果和实际操作技能提供了强有力的支持。 特…

【C++】STL简介 | STL六大组件 | string类 | string类对象操作

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的缺陷 5. 引出string类 6. 标准库中的string类 6.1 string类简介 6.2 string类对象的构造 6.3. string类对象的容量 6.4. string类对象的遍历 6.5. string类对象的修改 6.6. string类非成员函数 6.7. vs…

数控机床对滚珠丝杆的要求

随着数控机床高速高精度的发展需求&#xff0c;滚珠丝杆作为数控机床的主要进给功能部件之一&#xff0c;为确保机床传动精度&#xff0c;其选型及安装显得尤为重要&#xff1b;那么&#xff0c;数控机床对滚珠丝杆有什么要求呢&#xff1f; 1、精度保持性&#xff1a;滚珠丝杆…

《汇编语言》 第3版 (王爽)实验6解析

第7章 实验6解析 &#xff08;1&#xff09;.编程&#xff0c;完成问题7.9中的程序。 问题7.9 编程&#xff0c;将datasg段中每个单词的前4个字母改为大写字母。 assume cs:codesg,ss:stacksg,ds:datasgstacksg segment ;开辟了栈段空间&#xff0c;容量为16个字节dw 0,0,0,0…

selenium爬取房价收入比可视化

数据来源&#xff1a;聚合数据 from selenium import webdriver from bs4 import BeautifulSoup import csv from selenium import webdriver from fake_useragent import UserAgent import random import subprocess from selenium import webdriver from selenium.webdrive…

面试高频率问答题目

索引&#xff1a; 主键索引&#xff1a;表的id &#xff08;唯一 且 不能为空&#xff09; 唯一索引&#xff1a;表User 假设有account 字段 &#xff0c;用户名不重复 &#xff08;唯一 可以为空&#xff09; 复合索引&#xff1a;where() 的条件 用户名&#xff0c;密码 …

国创证券|黄金概念发力拉升,金贵银业两连板,山东黄金等走高

黄金概念5日盘中发力拉升&#xff0c;到发稿&#xff0c;金贵银业涨停&#xff0c;玉龙股份涨近9%&#xff0c;中润资源涨近6%&#xff0c;山东黄金、银泰黄金涨超3%。 值得注意的是&#xff0c;金贵银业已接连两个买卖日涨停&#xff0c;公司3日晚间公告&#xff0c;根据证券…

大气颗粒物与VOCs PMF源解析:环保行业的新利器

在现今日益严峻的环境问题中&#xff0c;大气颗粒物和臭氧污染尤为突出&#xff0c;它们不仅深刻影响着全球气候和生态环境&#xff0c;更对人体健康构成了严重威胁。为了有效应对这一挑战&#xff0c;我们首先需要深入了解颗粒物和臭氧的来源&#xff0c;特别是臭氧的前体物之…

#QT(智能家居界面上-图片插入)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 (1)添加图片文件&#xff08;图片资源文件&#xff0c;PNG格式为佳&#xff09; &#xff08;2&#xff09;将图片放入工程文件夹 &#xff08;3&#xff09;按如下步骤将图片加入到工程中&#xff08;pic.qrs文件夹&#xff09; &…

CSS实现水波球

使用CSS实现水波球效果&#xff08;单个的水波球&#xff09; 效果如下&#xff1a; <template><div class"indicator" ref"indicator" :style"border-color:${borderCol}"><span class"text">{{ completion }}%…

云桥通+跨国游戏:SDWAN组网解析跨国游戏企业的成功案例

运气通曾服务过一家国际知名的游戏开发公司C&#xff0c;C公司的游戏广受年轻人欢迎&#xff0c;所以&#xff0c;他C公司也顺理成章地拥有全国玩家基础。由于游戏的在线特性和全球用户分布&#xff0c;C公司面临着跨国游戏服务器之间的苦恼——稳定问题和网络连接问题。他们希…

elementUI el-table中的对齐问题

用elementUI时&#xff0c;遇到了一个无法对齐的问题&#xff1a;代码如下&#xff1a; <el-table :data"form.dataList" <el-table-column label"验收结论" prop"checkResult" width"200"> <template slot-sco…

[MRCTF2020]Transform1

a[33]"9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14" b[33]"103,121,123,127,117,43,60,82,83,121,87,94,93,66,123,45,42,102,66,126,76,87,121,65,107,126,101,60,92,69,111,98,77" python代码 a3 [103…

共筑前端学习之路:欢迎加入我们的前端组件学习交流群

共筑前端学习之路&#xff1a;欢迎加入我们的前端组件学习交流群 随着信息技术的飞速发展&#xff0c;前端开发作为构建数字化世界的重要一环&#xff0c;越来越受到广大开发者的关注和重视。为了更好地服务于前端开发者&#xff0c;尤其是那些对前端组件充满热情的粉丝&#x…