一 静态库的制作和使用
库文件分为两种 静态库文件 动态库文件
静态库文件 使用静态库文件链接生成可执行文件的时候,采用静态链接的方式.
文件的命名规则: 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
gcc−shared−olibpmath.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.c−L.−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 程序运行的时候,需要使用到动态库的时候才加载到内存中