一、lib类型:
  与windows下静态库(.lib)和动态库(.dll)一样,linux同样存在静态库(static library 文件后缀为.a)和共享库(shared library 文件后缀为.so),在/usr/lib目录下同时存在一个库的静态版本和动态版本。

"An archive (or static library) is simply a collection of object files stored as a single file.
When you provide an archive to the linker, the linker searches the archive for the object files
it needs, extracts them, and links them into your program much as if you had provided those
object files directly."

"A shared library is similar to a archive in that it is a grouping of object files. However,
there are many important differences.The most fundamental difference is that when a shared library is
linked into a program, the final executable does not actually contain the code that is
present in the shared library. Instead, the executable merely contains a reference to the
shared library."
  "the object files that compose the shared library are combined into a
single object file so that a program that links against a shared library always includes all
of the code in the library, rather than just those portions that are needed."
  以上引自《Advanced Linux Programming》

由此可知,静态库和共享库都是一个obj文件的集合,但静态链接后,执行程序中存在自己所需obj的一份拷贝,而动态链接后,执行程序仅仅是包含对共享库的一个引用。共享库相当于一个由多个obj文件组合而成的obj文件,在链接后其所有代码被加载,不管需要的还是不需要的。
似乎可以得出一个结论:
  静态链接后的程序比动态链接的所用存储空间大,因为执行程序中包含了库中代码拷贝;
  而动态链接的程序比静态链接的所用的运行空间大,因为它将不需要的代码也加载到运行空间。

二、lib编译:
静态库的编译,实际上是一个将.o文件打包的过程。
  ar -rc libfunc.a func1.o func2.o  # 将f1.o、f2.o编译成静态库libfunc.a
动态库的编译,使用gcc -fPIC -shared编译选项。
  gcc -fPIC -shared -o libfunc.so func1.o func2.o # 将f1.o、f2.o编译成动态库libfunc.so

三、lib调用:
静态库的调用比较简单,跟标准库函数调用一样
一个例子:main.c调用./lib目录下libfunc.a库,该库头文件在./inc目录下,编译:
  gcc -o test main.c -I./inc -L./lib -lfunc

共享库的调用需要注意库文件放置位置,如果该库文件不在/lib、/usr/lib下,则需要设置LD_LIBRARY_PATH变量。
一个例子:main.c调用./lib目录下libfunc.so库,该库头文件在./inc目录下,如果使用编译:
  gcc -o test main.c -I./inc -L./lib -lfunc
  ./test # 运行错误:error while loading shared libraries: libfunc.so
  这是因为动态链接时程序只是存放共享库的名称而不是绝对路径,所以运行时我们需要先设置该库所处位置:
  export LD_LIBRARY_PATH=./lib
  ./test # 运行成功
 
动态装载共享库:在只有共享库而没有库的头文件,或者你想在运行时动态加载、卸载库时,linux的dl库函数:dlopen、dlclose、dlsym帮你办到,其相当于windows下LoadLibrary、FreeLibrary、GetProcAddress函数
函数原型:
       void *dlopen(const char *filename, int flag);
       void *dlsym(void *handle, char *symbol);
       int dlclose(void *handle);
一个例子:main.c动态装载./lib目录下libfunc.so库,库中有一个函数void print_str(const char*);
       /*加载库*/
       void *handle = dlopen("libfunc.so", RTLD_LAZY);
       /*获得函数的入口*/
       void (*pt_str)(const char*);
       pt_str = dlsym(handle, "print_str");
       /*调用函数*/
       pt_str("hello world.");
       /*卸载库*/
       dlclose(handle);

四、相关说明:
1、共享库特别适合多个程序共享代码,升级程序部分功能模块,实现程序“插件”功能的情况;
   而静态库是一劳永逸,编译后不需要带一堆库文件跑,而且不管放置到哪里都可正常运行。
2、当搜索的库文件目录下同时存在该库的静态版本和共享版本时,链接器优先使用共享版本.so,此时你可以使用-static链接选项指定链接静态版本.a。
3、动态库可以导出两个特殊的函数:_init和_fini,前者在动态库被加载后调用,后者在动态库被卸载前调用,
我们可以使用这两个函数做些特别的工作。需要注意的是:在定义这两个函数后编译时,需要使用
-nostartfiles选项,否则编译器报重复定义错误。
4、ldd命令用来查看程序所依赖的共享库,同时也方便我们判断共享库是否被找到;
   nm命令查看obj文件(.so也是一个obj)中的标识(函数、变量)。

linux下的库文件相关推荐

  1. linux的库文件路径,Linux下的库文件搜索路径

    对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行&quo ...

  2. Linux下的库文件搜索路径

    对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行&quo ...

  3. 关于linux下的库文件

    先说说库文件是怎么来的吧. 以C为例,我们写一个程序,一般都不会把所有的函数都写在一个文件里面,通常都是划分模块,然后一个模块若干个文件,然后在main文件里面调用这些模块.我这里用一个magic.c ...

  4. linux下的 lib文件的学习思考

    说到这个LIB文件,先从一个小故障说起. 某日开发说,一台测试用虚机可以PING通SSH不能连了.运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢? 测试下,不管 ...

  5. linux下的lib文件

     zz:http://ooplab.org/post/421.html 作者:曹江华 赛迪技术天地 随着Linux性能的不断提升和逐渐普及,会有越来越多的人在Linux下从事应用软件的开发.这里笔 ...

  6. linux下静态库、动态库总结

    一.基本概念 1.1.什么是库        在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由 ...

  7. linux查看lib文件,linux下的 lib文件的学习思考

    说到这个LIB文件,先从一个小故障说起. 某日开发说,一台测试用虚机可以PING通SSH不能连了.运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢? 测试下,不管 ...

  8. Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

    Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...

  9. Linux下开源库的使用(共享库文件头文件配置全局搜索)(WSL)

    关键词 g++; vscode; c++; pkg-config; include; lib; linux; .pc; tasks.json; launch.json; WSL 前言 需求及手动解决方 ...

最新文章

  1. 详解:基于nginx tcp模块基本配置
  2. Mathematica求解微分方程组
  3. javaScript 验证码代码
  4. java常用类的方法,java常用类的使用方法
  5. 获得数据库中表字段的名字.txt
  6. 关于oracle with as用法
  7. c# wifi串口通信_C# 串口通信总结
  8. 运行与windows命令(cmd)的说明与示例
  9. 有关语音识别技术的一些信息点
  10. Git 分支 - 分支的新建
  11. 征途猎魔mysql数据库_字典列表的拓展理解
  12. 渗透测试技巧总结更新篇2
  13. 扣哒世界入选第33届国际信息学奥赛IOI专项赛
  14. 0基础2(在1基础之上)
  15. Android 通知屏幕亮起
  16. Odb文件(Abaqus)数据结构的一些思考
  17. 国内沪深股市的股票策略分析的简单案例
  18. Android开发五年,从月薪13K到年薪60W,我只用了三个月!
  19. 300期夏天计算机开机号,2018年300期福彩中心开机号附汇总
  20. 查看树莓派系统及版本

热门文章

  1. Kibana的离线安装部署
  2. 2019南京大学计算机系夏令营上机考试(一)
  3. 入驻亚马逊你该知道这些!—跨海汇
  4. mysql 创建学生表
  5. Windows 11彻底禁用IE浏览器,银行、政府、学校等老网站该怎么办?
  6. 我们只差一层处女膜的距离
  7. 【博客搬家】安装 Microsoft AppLocale 后出现的 Install Shield 安装界面乱码问题的解决办法
  8. 网站服务器宕机怎么办,网站宕机了,怎么办?
  9. Excel怎么批量将CSV格式转换为xlsx或xls格式?VBA、宏、软件?
  10. 验证身份证号是否合法