静态库与动态库的生成和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfeng0328/article/details/80515986

  • 静态库 
    静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。 
    链接时间: 静态库的代码是在编译过程中被载入程序中。 
    链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。

  • 动态库 
    动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so” 
    链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。

它们两个还有很明显的不同点:当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。(因为静态链接是在编译时将所有的函数都编译进了程序。而动态链接是在运行是才调用库里相应函数)


干货:(先上程序清单https://download.csdn.net/download/fengfeng0328/10448481


正常编译:gcc -o main main.c sub_add.c unsgn_pow.c -I ./include/            注意-I是大写的-i

静态库的生成与使用:

1)生成目标文件:

gcc -c sub_add.c

gcc -c unsgn_pow.c

2)打包成静态库:

ar rcsv libmymath.a sub_add.o

ar rcsv libmymath.a unsgn_pow.o

libmymath.a就是我们的静态库,静态库的命名规则:lib库名.a

3)使用静态库:

gcc -o main main.c -I ./include/ -L ./ -lmymath

动态库的生成与使用:

1)生成动态库:

gcc -shared -fpic -o libmymath.so sub_add.c unsgn_pow.c

libmymath.so就是我们创建的动态库,动态库的命名规则:lib库名.so

2)使用动态库:

gcc -o main main.c -I ./include/ -L ./ -lmymath

3)放置动态库以便程序调用:

cp libmymath.so /usr/lib

小结,总共有四种方法来解决动态库运行的的加载路径问题,这四种方法所产生搜索路径的先后顺序如下:
(1)  默认的动态库搜索路径/lib和/usr/lib
(2)  环境变量LD_LIBRARY_PATH指定的动态库搜索路径
(3)  配置文件/etc/ld.so.conf中指定的动态库搜索路径
(4)  编译目标代码时指定的动态库搜索路径




猜你喜欢

转载自blog.csdn.net/fengfeng0328/article/details/80515986