【摘要】动态链接库是在编译器编译之后生成 obj 文件之后,将几个链接文件和动态链接库中的文件链接起来,在链接器中将几个目标文件组合在一起然后生成可执行文件 exe 文件,而生成动态链接库的这一步骤是由编译器自己完成的,它可以调用自己已经处理好的库函数,在需要时直接拿出来使用就好了。而今天,我要分享给大家一个可以自己实现动态链接库生成的小技巧,别说,这种小技巧在面试中还是会被经常问到的哦。
方法一:
第一步:
先编写两个 .c 文件(为了方便,我写了一个最简单的 add.c 和 main.c 。add.c 就是直接做加法运算,main.c 是对 add函数的调用
第二步:
这一步很关键,要生成add的库文件 libadd.so (后面的名字是我自己起的,方便理解,你们也可以起其他的名字,但是一定要加上后缀 .so ,这是库文件的后缀)
输入命令行 ——> gcc -fpic -shared add.c -o libadd.so
经过这个步骤,你的文件夹下 用 ls 就可以看到已经生成了 libadd.so
第三步:
生成了动态库之后,我们需要把动态库和 main.c 文件通过系统编译器链接在一起进行编译,生成 a.out 可执行文件
输入命令行——> gcc libadd.so main.c
现在你再次 ls 一下,就会发现文件夹下又多了一个 a.out 文件。但是,你现在直接 ./a.out ,系统会报错,大概意思就是找不到你的动态库地址,,这个时候你需要找到你的动态库拷到 /lib/库中,这样才可以被系统检测到
第四步
将你自己的动态库拷到/lib/目录下
输入命令——>cp libadd.c /lib/
这个时候就已经大功告成了,你再次使用命令 ./a.out 程序就会顺利执行并且输出结果了。
方法二:
方法二的前三步和方法一都是一样的,所以如果你要想在方法一试过之后再尝试方法二,那你就需要删除 a.out 和 libadd.so 这俩文件了。
第四步:
现在我们已经知道了,如果系统没有找到我们自己生成的动态库的路径,就无法通过编译,在方法一里面,我们是直接将动态库拷到了 /lib/目录下,相当于充当了一个库文件,这次我们直接 vim 一把 ,将动态库的路径写到一个一个库文件中
输入命令行——> vim /etc/ld.so.conf.d/ku.conf
第五步:
刷新一下缓冲区
输入命令行——> ldconfig
然后你再次输入 ./a.out 也可以相应的输出结果啦,是不是并没有那么难呢。
但是,切记,你的动态库再使用完之后还是尽快删除吧。尽管这个库文件不是很大,也没有占用多少内存,但是,在以后的实际工作中,如果你要编写的代码量很大时,还是很耗费内存的。为了减少不必要的浪费,记得删除你自己的动态库文件哦。