动态链接库学习札记

  动态链接库是相对于静态链接库的一种说法,很多时候也叫做共享链接库,就连gcc编译动态链接库的选项也叫shared。之所以称之为共享链接库,是因为很多时候其都用于多个进程共享某个动态链接库。比如A进程调用了a.so里面的test()函数,而B进程也调用了a.so里面的set()函数,此时在内存中,就只需保留一个a.so文件,由调用了它里面函数的进程共享。

  调用动态链接库的程序,只有在执行的时候,才会去查找动态链接库里面所调用的函数,这样就减小了可执行文件的大小。而且当升级或者优化了动态链接库里的函数的后,只要不改变该函数的调用方式和该函数的返回值,调用该动态链接库的函数就可以不做任何修改。

  下面是我做的动态链接库的练习:

  本程序有一个动态链接库,libprint_hello.so,里面有一个函数int print_hello();main.c中调用了此函数。

vim print_hello.c

wps_clip_image-412

vim main.c

wps_clip_image-426

将print_hello.c编译成动态链接库:

gcc -c print_hello.c

gcc -fpic -shared print_hello.o -o libprint_hello.so

编译可执行文件

gcc main.c  -o main -L. -lprint_hello

此时执行./main发现报错“cannot open shared object file: No such file or directory”

这是因为程序在默认的路径下搜索lib文件的时候,发现找不到所需的libprint_hello.so动态库文件,最简单的办法就是把libprint_hello.so移动到/lib文件里面去,但是由于我这只是个测试文件,所以我采用另外一种方法。通过修改动态链接库的搜索路径变量,将我编写的动态链接库文件的目录加入到动态链接库搜索路径变量中就库了。

export LD_LIBRARY_PATH=/home/daveyhuang/gcc/so:$LD_LIBRARY_PATH

再执行./main函数:

wps_clip_image-899

这样,就达到了预期的效果。

编译其的Makefile如下。

vim Makefile:

wps_clip_image-946

你可能感兴趣的:(学习)