UC学习day03 静态库 环境变量 动态库

本文详细介绍了静态库和动态库的制作过程及其使用方法,包括目标文件的生成、库文件的打包和可执行文件的链接。同时,探讨了环境变量的作用和设置,以及动态库的加载机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 静态库的制作和使用
库文件分为两种 静态库文件 动态库文件
静态库文件 使用静态库文件链接生成可执行文件的时候,采用静态链接的方式.
文件的命名规则: lib库名.a
制作和使用的步骤:
1 将所有要加入静态库的模块编译为目标文件.
tarena@ubuntu:~/uc/day03/t_math$ ls
add.c main.c mul.c p_math.h
tarena@ubuntu:~/uc/day03/t_math$ gcc -c add.c mul.c tarena@ubuntu:~/uc/day03/t_math$ ls
add.c add.o main.c mul.c mul.o p_math.h

2 将第一步生成的目标文件打包到静态库文件中
tarena@ubuntu:~/uc/day03/t_math$ ar -r libpmath.a *.o
ar: 正在创建 libpmath.a
tarena@ubuntu:~/uc/day03/t_math$ ls
add.c libpmath.a mul.c p_math.h
add.o main.c mul.o

3 使用静态库文件链接生成可执行文件
tarena@ubuntu:~/uc/day03/t_math$ gcc -c main.c
tarena@ubuntu:~/uc/day03/t_math$ gcc main.o -L. -lpmath
tarena@ubuntu:~/uc/day03/t_math$ ls
add.c a.out main.c mul.c p_math.h
add.o libpmath.a main.o mul.o
tarena@ubuntu:~/uc/day03/t_math$ ./a.out
6+2=8
-L路径 链接器寻找库文件的路径
-l库名 指定要找的库的名字

二 环境变量
进程的概念
程序和进程
程序是计算机指令的集合.磁盘上的,静态的
进程是程序运行的实例.将程序加载到内存执行的时候,称作进程.
动态的.
一个程序运行一次,期间就是进程.程序运行完毕进程就结束了.
进程分为用户级进程 系统级进程
所有的用户级进程构成了一颗进程树.
pstree(1) 可以查看用户级进程树

进程间的关系 父子关系 兄弟关系
每个进程都维护着一个环境变量的列表.进程可以使用这些环境变量指定的值去访问计算机系统的相关资源.

bash这个进程的环境变量.
bash进程有两种类型的变量 自定义类型的变量 环境变量
环境变量是可以被子进程继承的变量.
自定义变量是进程私有的,不能被子进程继承.

如何查看bash进程的环境变量列表
env(1)
USER=tarena //这是环境变量的组织格式
$name 取环境变量的值
USER=beijing 如果有这个环境变量,将环境变量的值改为beijing
如果没有这个环境变量,将这个变量添加到进程的自定义变量列表中.
注意一点 =的两边绝对的不允许出现空格

export name 将name设定为环境变量
unset name 删除环境变量
PS1 自定义变量
指定了bash的提示符
tarena@ubuntu:~/uc/day03/t_math$ echo KaTeX parse error: Expected 'EOF', got '\[' at position 5: PS1 \̲[̲\e]0;\u@\h: \w\…{debian_chroot:+($debian_chroot)}[\033[01;32m]\u@\h[\033[00m]:[\033[01;34m]\w[\033[00m]$

tarena@ubuntu:~/uc/day03/t_math$ env|grep PS1

PS1="\W$"

bash进程执行的时候,会执行一个脚本文件.通常将环境变量 自定义变量 别名定义在这个脚本文件中.
~/.bashrc

PATH 环境变量
~$echo $PATH
/home/tarena/Qt5.4.1/Tools/QtCreator/bin:/home/tarena/Qt5.4.1/5.4/gcc/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

在bash上输入a.out的时候,执行当前路径下的a.out可执行文件.
PATH=/home/tarena/Qt5.4.1/Tools/QtCreator/bin:/home/tarena/Qt5.4.1/5.4/gcc/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:.

export PATH=$PATH:.

三 动态库的制作和使用
动态库的命名规则: lib库名.so
制作和使用的步骤:
1 将要加入动态库的源文件编译为目标文件(与位置无关的目标文件)
t_math l s a d d . c m a i n . c m u l . c p m a t h . h t m a t h ls add.c main.c mul.c p_math.h t_math lsadd.cmain.cmul.cpmath.htmathgcc -c -fPIC add.c mul.c
t_math$ls
add.c add.o main.c mul.c mul.o p_math.h

-fPIC:生成与位置无关的目标文件

2 将第一步生成的目标文件打包到动态库文件中
t_math g c c − s h a r e d − o l i b p m a t h . s o ∗ . o t m a t h gcc -shared -o libpmath.so *.o t_math gccsharedolibpmath.so.otmathls
add.c libpmath.so mul.c p_math.h
add.o main.c mul.o

3 使用动态库链接生成可执行文件
t_math g c c m a i n . c − L . − l p m a t h t m a t h gcc main.c -L. -lpmath t_math gccmain.cL.lpmathtmathls
add.c a.out main.c mul.o
add.o libpmath.so mul.c p_math.h

t_math$a.out
a.out: error while loading shared libraries: libpmath.so: cannot open shared object file: No such file or directory

使用静态库链接生成的可执行文件.从静态库中找到程序中使用的模块,将这些模块合并到可执行文件中.可执行文件是独立的文件.不再依赖静态库文件.

使用动态库生成的可执行文件.和动态库是两个独立的模块.这种可执行文件要执行的时候,必须将可执行文件和动态库一起加载到内存.
需要指到可执行文件依赖哪些动态库文件?
ldd a.out
告诉动态链接器到哪里去找动态库文件.
两种方法解决
1 使用LD_LIBRARY_PATH环境变量告诉动态链接器
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

2 链接器默认的搜索路径是/lib或者/usr/lib

地址分为三种
1 固定地址
2 与位置无关的目标文件地址 相对地址
3 程序运行的时候,需要使用到动态库的时候才加载到内存中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值