LINUX系统编程入门
GCC
GNU开发的编程语言编译器,支持多种标准 -std-c99
sudo apt-install gcc g++
gcc/g++ -v/--version
编程语言的发展 :高级语言-汇编语言-机器语言-计算机运行
GCC工作流程
源代码-预处理器-预处理后源代码.i-编译器-汇编代码.s-汇编器-目标代码.o,启动代码,库代码,其他目标代码-链接器-可执行程序.exe .out
预处理 编译 汇编 链接
GCC常见参数
静态库的制作
静态库的在静态阶段链接到了程序中,动态库在程序运行的时候系统动态加载到内存中供程序调用
库不能单独运行
命名规则 linux libxxx.a
gcc获得.o文件,将.o文件打包,使用ar工具
r-将文件插入备忘文件 c-建立备忘文件 s-索引
gcc -c test.c只生成test.o,不链接
ar rcs libtest.a test.o
静态库的运用
找不到文件,去指定目录下面寻找 gcc main.c -o app -I ./include/
找不到库,库的名称,以及指定库的路径 gcc main.c -0 app -l calc(库文件)-L ./lib/
动态库的运用
Linux libxxx.so
gcc得到.o文件 得到位置无关的代码 gcc -c -fpic/-FPIC(位置无关) a.c b.c
gcc得到动态库 gcc -shared a.o b.o -o libcalc.so
先生成动态库,在执行main同样的添加文件和库
ldd main 查看
需要在添加动态库的绝对路径
1.通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:绝对路径(删除之后就没有了
永久配置
2.用户级别的配置 vim .bashsrc
在文件里加入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:绝对路径
执行. .bashsrc
3.系统级别的配置
sudo vim /etc/profile
在文件里加入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:绝对路径
. /etc/profile
2024.7.17 5.30
静态库优点 加载速度快,发布程序无需提供静态库,移植方便
缺点 消耗系统内存,部署麻烦
动态库优点 可以实现进程内资源共享,更新部署发布简单,可以控制何时加载动态库
缺点 加载速度比静态库慢,发布程序时候需要提供依赖的动态库
makefile
Makefile定义
那些文件先编译,那些文件需要重新编译,带来自动化编译的好处
make是一个命令工具,Linux下Gnu的make
命名
makefile或者Makefile
makefile规则目标 ... :依赖 ...
命令
....
vim Makefile
make
./make
工作原理
Makefile其他规则是为第一条规则服务的
命令在执行之前,需要先检查规则中的依赖是否存在,不存在的话向下查找其他规则
检查更新,在执行规则的命令中,会比较目标和依赖文件的时间;如果依赖的时间比目标晚,会重新,会重新生成目标
变量
模式匹配
函数
GDB
GDB是调试工具,启动程序;在断点处停住;当程序被停下,检查发生的事情;可以改变程序
关掉优化选项-o 打开调试选项-g(一定),在可执行文件中加入源代码的信息
gcc -g -Wall program.c -o program
gcc test.c -o test -g
gdb test
set args 10 20
show args
until 跳出当前循环 在执行完循环体内的最后一条语句之后执行 until,才可以跳出循环
文件IO
文件指针:文件描述符int _fileno,读写指针位置,I/O缓冲区
标准c库被调用的时候会系统调用得到文件描述符fd,再给int -fileno
虚拟地址空间不存在
程序是文件,保存在磁盘中
进程正在运行的程序,占用内存,虚拟地址空间映射到物理空间
文件描述符表前三个默认被占用,标准输入、输出、错误,每个表项都指向一个打开的文件
一个文件可以多次被打开,但是对应的文件描述符表不一样
open / close
man 2 Linux系统调用 man 3 c库,标准库
read/write
lseek
stat