Linux学习全部合集点击即可订阅
“人生得意须尽欢”
这里是目录标题
- gcc的基本操作
- gcc处理代码的步骤
- 预处理
- 编译
- 汇编
- 链接
- 头文件和库
- 静态库
- 动态库
- gdb调试
- makefile
- 什么是makefile?
- 进度条的实现
- 缓冲区
- 回车和换行
- git的使用
- .gitigonre
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的仓库。
这些文件都是垃圾文件。都是动态库,静态库等文件