Linux 静态库、动态库的创建和使用,环境变量初识。

今天整理一下linux静态库和动态库的创建和使用以及对环境变量的初步了解!

首先创建一个简单的函数入如下:

main.c

  1 #include<stdio.h>
  2 #include"test.h"
  3 int main(void){
  4     int a=6,b=4;
  5     printf("%d+%d=%d\n",a,b,func(a,b));
  6     printf("%d*%d=%d\n",a,b,func1(a,b));
  7     return 0;
  8 }
test.c

  1 #include"test.h"
  2 int func(int a,int b){
  3     return a+b;
  4 }
test1.c

  1 #include"test.h"
  2 int func1(int a,int b){
  3     return a*b;
  4 }
test.h

  1 #ifndef _TEST_H_
  2 #define _TEST_H_
  3 int func(int a,int b);
  4 int func1(int a,int b);
  5 #endif
以上代码为输出a+b和a*b的值

我们先创建静态库

首先需要将.c文件编译成.o的目标文件 

使用gcc -c test.c test1.c

得到 test.o test1.o 两个目标文件(静/动态库就是对这两个文件的打包)

再使用命令 ar -r libhaha.a test.o test1.o   (libhaha.a为库文件,库文件必须以lib就开头 且静态库的后缀为.a)

就可以得到 libhaha.a 的静态库文件。

最后链接这个静态库文件与主函数的main.c 就可以生产可执行文件 a.out

链接的命令为 gcc main.c  -L.  -lhaha   (其中-L 后面跟你的库文件的路径,我这样执行的库文件就在当前路径,所以只用写个"".""。-l的后面跟你库文件的名字,lib是库文件的格式 haha才是名字)。

我们再运行 ./a.out 就可以得到结果如下:

tarena@ubuntu:~/LIANXI/10.10$ ./a.out
6+4=10
6*4=24

我们对 静态库函数的结果进行nm 查看它的符号表得到结果如下:

0000000000400564 T func
0000000000400578 T func1
00000000004004f4 T main
                 U printf@@GLIBC_2.2.5
可以看到func func1 函数前面都是T  程序里有它的二进制代码 。 且 T前面有明确的地址。(为什么它叫静态,对比下面动态库)


然后我们再来创建动态库函数:

首先我们使用命令 gcc -c -fPIC test.c test1.c    // -fPIC是什么?(先记住,自己查)

生成 test.o 和  test1.o 两个目标文件
然后使用 命令 gcc -shared -o libhehe.so *.o    //*.o 表示test.o和 test1.o

生成动态库 libhehe.so                                      //so为动态库的后缀

最后和静态库一样使用 gcc main.c -L. -lhehe 命令来生成可执行文件a.out

运行结果如下:

tarena@ubuntu:~/LIANXI/10.10$ ./a.out
./a.out: error while loading shared libraries: libhehe.so: cannot open shared object file: No such file or directory
系统提示错误:没有找到这个库文件

我们使用ldd命令可以查看运行文件依赖于那些库文件结果如下:

tarena@ubuntu:~/LIANXI/10.10$ ldd a.out
	linux-vdso.so.1 =>  (0x00007fff0c9fe000)
	libhehe.so => not found      //没有找到
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007effd2288000)
	/lib64/ld-linux-x86-64.so.2 (0x00007effd265c000)
我们使用环境变量 LD_LIBARAY_PATH 可以查看系统找动态库文件的路径

使用命令 echo $LD_LIBARAY_PATH 查看 结果如下为空

tarena@ubuntu:~/LIANXI/10.10$ echo $LD_LIBRARY_PATH

tarena@ubuntu:~/LIANXI/10.10$ 

说明系统没有找动态库的路径,那我们给他加一个路径让他找到我们的动态库。

使用命令export  LD_LIBARAY_PATH=.      //"."代表当前文件夹

然后再运行可执行文件a.out 就可以得到结果如下:

tarena@ubuntu:~/LIANXI/10.10$ ./a.out
6+4=10
6*4=24
我们来查看一下这个可执行文件的符号表  nm a.out 部分结果如下:

                 U func
                 U func1
0000000000400684 T main
                 U printf@@GLIBC_2.2.5
可以看到func func1 前面都是U 且 U前面没有地址!

所以说动态库链接就是这些符号的地址在编译链接生成可执行文件的时候还不确定,在代码加载到内存的时候才发生链接,地址才确定!

链接的时机发生在代码执行的时候,这个链接就叫做动态链接


以上就是静态动态库的创建和使用。


下面介绍几个环境变量

首先什么是环境变变量?

答:操作系统为程序的运行提供了环境,通过变量来实现,这就是环境变量!

什么是程序?什么是进程?

答:程序是静态的,你写好的函数集合(指令集合)放在磁盘上的。程序运行起来就是进程!是动态的,程序加载到内存上就是进程。进程是程序的实例,程序运行几次就有几个进程!

1、env命令可以查看当前的环境变量

2、提取环境变量的值用 $+环境变量的名字 用echo输出 。例如 echo $PATH

3、PATH 的含义: 

 当用户在bash下键入一条命令的时候,首先在PATH指定的路径下查找这个命令的可执行文件,如果在第一个路径中找到这个命令的可执行文件,就将这个可执行文件加载到内存执行,如果找不到就到第二个路径中找........到最后一个时,还找不到命令的可执行文件就报错。

有这个定义那么我们在PATH路径里加上当前路径"."的话 在执行可执行文件是就不用刚输入./a.out了  只需输入 a.out


补充:链接器和加载器的默认地址都是 /lib 和/usr/lib (在动态链接是除了将LD_LIBRARY_PATH设置为当前目录下,还可以将动态库放到连接器的默认目录下)

要永久更改环境变量在根目录下的.bashrc中添加环境变量即可。

大笑大笑大笑大笑完!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值