gcc和gdb的使用——Linux

Linux学习全部合集点击即可订阅

“人生得意须尽欢”

gcc的基本操作

编写代码的最基本操作

gcc 文件名
//运行C++代码
g++ 文件名

编译后默认生成的文件是a.out

gcc处理代码的步骤

宏观上的步骤。
实际上是从文本转换为二进制的语言

计算机为什么只认识二进制?
因为计算机中的各种硬件只认识二进制。二进制计算机是现在的主流计算机。

因为gcc和g++的选项都是一样的,所以以gcc为例。

以下这条命令的含义是指定翻译后的文件。
一步到位,直接将文本变为计算机认识的二级制。

gcc test.c -o mytest

预处理

注意:底行模式输入vs test.c 可以实现分屏
ctrl+w可以切换分屏

-E选项的意思就是让程序开始翻译,当预处理完成后,就写到test.i这个文件中,然后停止翻译。-o选项是指定写到某个文件的意思

gcc -E test.c -o test.i

1.主要进行宏替换
2.头文件的展开
3.去掉注释
4.条件编译

预处理工作实际就是做了文本处理的工作。

编译

核心工作就是将C语言翻译成为汇编语言。
汇编语言不需要懂,只要知道和语言不一样就行。

汇编语言的文件一般都是.s
-S进行程序的翻译,编译完成之后就停止下来。

gcc -S test.i -o test.s

汇编助记符,比如movl call 等这些就是汇编语言

汇编

核心工作是将汇编语言翻译成可重定位二进制文件
以.o或.obj结尾。

-c:从现在开始进行程序翻译,当汇编结束后,就停下来。

gcc -c test.s -o test.o

test.o就是二进制文件。

虽然这个.o是一个二进制文件但是并不能运行。
为什么不能执行?因为test.o中还有一些符号没有和系统相关联。
比如我们的printf函数,需要与系统中的C标准库相关联,所以就要用到最后一步链接。

链接

gcc test.o 自动搜索需要用到的库,自动链接。

gcc test.o -o mytest

最后生成了可执行程序mytest。

以下命令可以查看mytest所依赖的库。

ldd mytest

头文件和库

C语言程序写好了,一般需要链接库。

头文件:头文件里一般包含的是函数的声明
。头文件给我们提供了可以使用的方法,所有的开发环境有语法提示,本质是通过头文件帮我们搜索的。

库文件:给我提供了可以使用的方法的实现。

而我们写程序是包含头文件,链接库文件

静态库

在Linux中以.a结尾的,在windows是以.lib结尾的

静态库对应静态链接
相当于把库里的代码直接拷贝到自己的可执行程序里面。

优点:不依赖任何库,程序可以独立运行。
缺点:浪费资源。

动态库

在Linux中动态库是以.so中运行的。在windows中是以.dll结尾的。比如英雄联盟文件里有dll文件。

动态库对应动态链接

动态链接的意思就是在一段程序从上至下运行的过程中,如果某一行用到了某个方法,就去对应的库里调用。

链接是产生关系。不是执行。

优点:所有命令共享同一个库,可以节省资源。
缺点:一旦库缺失,会导致几乎所有的程序失效。

默认情况下,形成的可执行程序就是动态链接的。

如果想生成静态链接就在命令后面加上-static选项。

gcc test.c -o mytest2 -static

假如只写一个helloworld,静态库的文件大小是动态库的一百倍。

所以更推荐使用动态链接。

gdb调试

Linux中gcc 默认生成的realease版本,不能调试。
想要调试则必须要使用debug版本。

在后面加上-g选项即可。

gcc hello.c -o hello_g -g

debug里面包含了很多调试信息。
而realease里面没有调试信息。

gdb hello_g

l main//显示包含main函数的代码

gdb的回车键 可以继续执行上一条指令。

b 15//表示在第15行打断点
info b//查看断点
p 变量名//可以查看变量的值
d 1//表示取消第一个断点。

s可以逐语句的走

s

逐过程的走
next的简写n

n//相当于vs的f10
quit//可以停止调试

bt可以查看调用堆栈。

display相当于vs的监视

display 变量名//可以常显示变量的值
undisplay 序号//取消常显示的变量

until跳转到指定位置

until 行号

从一个断点直接跳到另一个断点,在vs中是一直按f5即可直接跳到下一个断点。

在Linux中命令是
c,全称是continue

c

假如进去一个函数,怎么快速将函数跑完?
finish命令可以完成这个任务

finish

makefile

makefile只要会用就行。在公司里也不用写Makefile,因为公司里面会有自动生成Makefile的工具。

项目构建
1.假如是多文件比如.h.cpp,先编译哪一个程序?
2.链接需要哪些库?
3.库和头文件去哪里找?
4.整个项目结构,该如何?

假如一个项目里存在100个.cpp的文件,你只能把这些文件一个个的编成.o文件。这样很慢。
所以makefile可以解决这个问题。

什么是makefile?

make是一个命令。
makefile是一个文件。

首先需要自己在当前目录下创建一个makefile

然后再makefile里面添加依赖关系和依赖方法。
1.依赖关系:
技巧:iso
mytest 依赖于 test.o
test.o 依赖于 test.s
test.s 依赖于 test.i
test.i 依赖于test.c

1.依赖方法
就是gcc的一些命令

gcc test.o -o mytest
gcc -c test.s -o test.o
gcc -S test.i -o test.s
gcc -E test.c -o test.i

在这里插入图片描述

怎么清理可执行程序?
.PHONY叫做伪目标,是makefile中的一个关键字。被.PHONY修饰事,表示是总是被执行的。
什么意思呢?什么叫做总是被执行呢?
首先看一下什么叫做不被执行。

假如你make了一次,test.c没有更新,则不会再执行make的依赖方法。

总是被执行的意思就是可以一直make,然后可以执行。

伪目标也是目标。
伪目标总是被执行的。

.PHONY:clean
clean:
	rm -rf mytest

所以说clean是可以一直执行的。

makefile是如何识别我的文件是新的还是旧的呢?

一个文件有三个时间
access是访问时间
modify是文件内容修改的时间
change是文件属性修改的时间

修改文件内容可能会引起文件属性的变化,因为内容增加,大小会增加。

**makefile是通过对比test.c的文件和可执行程序mytest的文件内容的修改时间的早晚来确定文件是不是最新的。**假如源文件的时间比较新,则就是test.c的文件比较新。

多文件的makefile编写
假如有文件main.c hello.c hello.h文件
在这里插入图片描述

进度条的实现

Linux提供了一个sleep函数,是按照秒来提供休眠的。

这个程序先在屏幕上打印hello,再睡眠3秒钟结束程序。
在这里插入图片描述C语言的执行程序是从上往下进行执行的。
\n是行刷新,可以给缓冲区进行刷新。

所以直接显示到屏幕上后,在睡眠3秒。

缓冲区

缓冲区指的是哪里的缓冲区?
是缓冲区就说明他是一段内存。只要不刷新,则数据一直在内存中。

怎么才能将内存中的数据刷新出来?
1.行刷新,输入的数据是一行则就刷新出来。
2.flussh(stdout)可以来刷新缓冲区
3.程序结束return 0可以来刷新缓冲区

回车和换行

键盘上的回车键是融合了\r和\n。

实际上的\r是回到行首,叫做回车
\n是换行,就是换行。
严格意义上说,换到新的一行,并不回到行首,叫做换行。

简单进度条代码
注意usleep是微秒来算的
%-100s是按照左对齐预留100个空间

#include<stdio.h>
#include<string.h>
#include<unistd.h>
void test()
{
    
    
  char bar[101];
  memset(bar,'\0',sizeof(bar));

  const char* lable = "|/-\\";

  int cnt = 0;
  while(cnt <= 100)
  {
    
    
    printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%4]);
    fflush(stdout);
    bar[cnt++] = '#';
    usleep(20000);
  }
  printf("\n");
}
int main()
{
    
    
  test();
  return 0;
}

git的使用

git是什么?
git什么是版本管理?
进行版本控制,来保存历史的记录。

1.gitclone把远程的仓库拉取到本地。

git clone 仓库地址

2.git status可以查看需要提交的文件
3.git add 文件名
4.git commit -m “备注不要瞎写”
5.git push

git commit 命令用来将本地暂存的修改提交到版本库

假如你修改了gitee上的仓库代码,但是本地没修改,是不能git push的。

需要先git pull拉取到本地进行更新本地代码

.gitigonre

这是git文件的黑名单,意味着是这些文件的其中之一就不能进去git的仓库。
这些文件都是垃圾文件。都是动态库,静态库等文件

猜你喜欢

转载自blog.csdn.net/qq2466200050/article/details/128594698