Linux小白进阶-3
今日学习
1. 基于刚安装的Ubuntu20
- 切换root
无法切换root,提示“Authentication failure”:
需要给root用户设置密码:
命令:sudo passwd root
- gcc编译器安装
gcc安装参考链接:
https://www.cnblogs.com/livelab/p/13049117.html
2.编译器gcc
源文件到可执行文件执行的步骤:
预处理–编译–汇编–链接
- 预处理
头文件展开
<>:仅在系统的头文件目录搜索
" ":先在当前目录查找,再到系统目录查找。
宏替换
#ifndef #else #elseif (条件编译)
只进行预处理:
gcc -E hello.c
重定向:
gcc -E hello.c > hello.i
debug_msg:
gcc hello.c -D__DEBUG__(=值)
当头文件不在当前目录:
gcc hello.c -I(debug.h的绝对路径or相对路径)
- 编译
将预处理文件编译生存汇编文件 .s;
gcc -S hello.c
- 汇编
将汇编文件编译生成目标文件 .o (机器码);
gcc -c hello.c
-
链接
将目标文件编译生成可执行文件。
(符号表的建立)可执行文件重起名字
默认a.out
gcc demo.c -o demo
3.静态库动态库创建:
库文件:保存函数和变量;特点;只能使用不能看见其实现;
将使用的功能函数做成库,这样就可以看不见实现;
Linux库文件分类:
静态库.a:在编译时加载:将需要的函数或者变量,在编译过程中将其从静态库中搬迁到源文件;
动态库.so:在运行时加载:将需要的函数或者变量,在运行过程中需要什么搬迁什么。
使用静态库和使用动态库生成的可执行文件额区别?
大小:静态库 > 动态库 内存效率
运行速度:静态库 > 动态库 节省了运行时间
编译速度:静态库 < 动态库
升级的方便程度:静态库 < 动态库
程序的部署方便程度:静态库 > 动态库
- 静态库:
将源文件 .c 编译成目标文件 .o
gcc -c 源文件.c
生存静态库:ar
ar rcs 静态库名(lib+库名).a 目标文件.o
链接库:
(main 需要使用到目标函数的功能的可执行文件)
gcc main.c -l库名 -o main (需要将库拷贝到 /user/lib)
gcc main.c -l库名 -L.(.表示当前路径) -o main
- 动态库:
gcc -shared -fPIC 目标源文件.c -o lib+库名.so
动态库使用:
gcc main.c 路径/动态库.so -o main
4.调试器gdb
- gdb 汇编命令
layout asm
layout src
layout split
- gdb next
step
可以进入函数 但是n
(next)不可以
- 可视化:
gdb demo --tui
5.工程管理器make
实现自动编译,省去gcc的麻烦;
如何编写makefile:
mikefile–脚本文件–批处理
makefile语法三要素:目标、依赖、命令
- Makefile内容:
(echo
输出后面内容)
- 实现结果: