动态库与静态库详细说明

动态库:

生成:

1:gcc test_b.c -fPIC -shared -o libtest.so/*生成动态库  可以不用先生成.o文件,直接做成一个动态库。
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的*/
2:gcc -fPIC -c test.c //也可以先生成.o文件,然后再做成动态库
gcc -shared -o libtest.so test.o

链接:

1:gcc test.c -L. -ltest//-L 后面接路径 ,比如 -L . 表示库在当前路径下,test是动态库的名字,这种方式有可能出现运行程序时找不到库的问题。
2:gcc test.c ./libtest.so //直接加路径,指定库名链接,这种方式不用担心运行程序时找不到库的问题。

链接动态库时,系统有个动态链接器,程序运行的时候时通过动态链接器去找动态库,如果动态链接器寻找的路径中没有我们要的动态库,就算程序编译过了也运行不了,这时候有几种解决办法;

  1. 修改环境变量, 通过环境变量LD_LIBRARY_PATH把当前库目录添加到共享库的搜索路径
  2. 编辑/etc/ld.so.conf文件,将库文件所在路径加进去,运行ldconfig -v,该命令会重建/etc/ld.so.cache缓存文件, 动态链接器就从 这个缓存中搜索共享库
  3. 将动态库复制到/lib 或 /usr/lib 或 /usr/local/lib 系统都能找到
  4. 编译的时候将动态库的路径写死 gcc test.c -L. -lahelp -Wl,-rpath,/home -Wl,-rpath,/home表示-rpath /home是由gcc传递给链接器的选项

动态库特点总结:

  1. 动态库运行时再链接,很容易出现编译过了运行找不到库的问题。
  2. 可以实现进程之间的资源共享。(因此动态库也称为共享库)
  3. 将一些程序升级变得简单。
  4. 程序运行时还需要动态库存在
  5. 动态库的大小比静态库要大得多

静态库:

生成:

gcc -c test.c -o test.o
ar rsc libtest.a test.o  //先要生成.o文件 在把所有的.o文件 打包成一个静态库

ar命令参数说明
r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块//在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以//使用其他任选项来改变增加的位置。
c:创建一个库。不管库是否存在,都将创建。
s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果。a文件缺少索引,可以使用ranlib命令添加

链接:

1:gcc test.c -L. -ltest;//-L 后面接路径 ,比如 -L . 表示库在当前路径下,test是静态库的名字。
2:gcc test.c ./libtest.a;//接加路径,指定库名链接

静态库特点总结:

  1. 静态库编译时链接。
  2. 程序在运行时与函数库再无瓜葛,移植方便。
  3. 只要编译过了,就不用担心运行问题。
  4. 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件,会导致可执行文件会占用比较大的空间。
  5. 是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
发布了3 篇原创文章 · 获赞 3 · 访问量 107

猜你喜欢

转载自blog.csdn.net/wazqybz/article/details/102590606