原文请见 Linux动态链接和静态链接简析

0. 库名与真正的库文件名

就拿数学库来说,他的库名是 m,他的库文件名是libm.so,很容易看出,把库文件名的头 lib 和尾.so去掉就是库名。(gcc xxx.c -lm( 动态数学库))

既然我们已经知道如何根据库文件名得到库名,那么在使用 gcc/g++ 编译一些文件时,又该如何使用库呢?比如我们自已要用到一个第三方提供的库名字叫 libtest.so,那么我们只要把 libtest.so 拷贝到 /usr/lib里,编译时加上-ltest 参数,我们就能用上 libtest.so 库了(当然要用 libtest.so库里的函数,我们还需要与 libtest.so 配套的头文件)。

放在 /lib 和 /usr/lib 和 /usr/local/lib 里的库直接用 -l 参数就能链接了,但如果库文件没放在这三个目录里,而是放在

其他目录里, 这时我们只用 -l 参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find
-lxxx”,也就是链接 程序 ld 在那3个目录里找不到libxxx.so,

1. 生成静态链接库

gcc -c h.c -o h.o
ar cqs libh.a h.o
  • ar是生成库的命令,
  • cqs是参数,
  • libh.a是生成的静态链接库须以lib开头,h是库名,
  • a表示是静态链接库,h.o是刚才生成目标文件

2. 生成动态链接库

gcc -c h.c -o h.o

生成动态链接库用gcc来完成

gcc -shared -WI -o libh.so h.o
  • -shared -WI是参数(WarningImplicit),
  • libh.so是生成的静态链接库须以 lib 开头,h是库名,
  • so表示是动态链接库,h.o是刚才生成目标文件

3. 将生成的libh.a,libh.so拷贝到/usr/lib或/lib下

4. 编译带静态链接库的程序

gcc -c test.c -o test.o
gcc test.o -o test -WI -Bstatic -lh
  • -WI -Bstatic表示链接静态库,
  • -lh 中 -l 表示链接,
  • h 是库名即/usr/lib下的libh.a

5. 编译带动态链接库的程序

gcc -c test.c -o test.o
gcc test.o -o test -WI -Bdynamic -lh
  • -WI -Bdynamic表示链接动态库,
  • -lh中-l表示链接,
  • h是库名即/usr/lib下的libh.so

6. 运行。/test得到结果

有些库形如 libh.so.1.0, 1.0 表示版本号。若要使用该库,通常要建立一个软连接,用 ln -s libh.so.1.0 libh.so. 系统不知道1.0为何意思。

7. 其他知识

编译连接时同时要用动态和静态链接库,则用如下命令

gcc test.o -o test -WI -Bstatic -lh1 -WI -Bdynamic -lh2

8.动态库和静态库的位置问题

把动态库或者静态库放在/usr/lib或者/lib下,在链接的时候系统会自动到这两个目录下寻找。如果没有放在这两个目录下,则修改/etc/ld.so.conf文件,把目录写入该文件,然后ldconfig,就OK了。

如果没有放在usr/lib或者/lib目录下,也不修改/etc/ld.so.conf文件,也可以在编译的时候加上 -L/路径 也可以。但是在执行的时候还是会提示找不到库的所在。

Linux 动态链接和静态链接简析(库名与库文件名)相关推荐

  1. c++定义一个动态全局变量_静态链接与动态链接的宏观概述及微观详解

    静态链接与动态链接的宏观概述及微观详解 第一部分 宏观概述 1. 静态链接 静态链接就是在程序运行前,链接器通过对象文件中包含的重定位表,完成所有重定位操作,并最终形成一个在运行时不需要再次进行依赖库 ...

  2. “.dll .obj .lib”和“ .so .o .a”文件与动态链接和静态链接

    ".dll .obj .lib"和" .so .o .a"文件 (1) .dll .obj .lib使用在windows平台下. .dll:动态链接库,作为共享 ...

  3. Linux-动态链接与静态链接对比(动态库和静态库)

    博客转载自:Linux-动态链接与静态链接对比 一.库的基础概念: 在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于wi ...

  4. Linux 关于动态链接库以及静态链接库的一些概念

    From http://os.rdxx.com/Linux/LinuxRudiment/2008/5/17017197011.shtml 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. ...

  5. Linux gcc 制作动/静态链接库

    gcc 静态链接库 以 math.c为例 gcc -c math.c ar rcs libmath.a math.o ar命令 将多个文件打包成一个备份文件 参数r:用来替换库中已有的目标文件,或加入 ...

  6. 编译有哪些阶段,动态链接和静态链接的区别 c++

    预处理-->编译-->汇编-->链接 预处理:编译器将C程序的头文件编译进来,还有宏的替换 编译:这个阶段编译器主要做词法分析.语法分析.语义分析等,在检查无错误后后,把代码翻译成汇 ...

  7. 符号引用,动态链接,静态链接,直接引用的区别

    在类加载的时候会有5部分:加载,验证,准备,解析,初始化 静态链接 在解析的时候将符号引用变为直接引用,该阶段会把一些静态方法比如mian方法 替换为指向数据所存内存的指针或者句柄等(直接引用) 动态 ...

  8. Linux下动态链接库与静态链接库(编写、编译)

    这里写目录标题 函数库的概念 动态库的编译 静态库的编译 动态库相对于静态库的优点和缺点 优点 缺点 函数库的概念 函数库一般分为静态库和动态库两种. 静态库: 是指编译链接时,把库文件的代码全部加入 ...

  9. 通俗举例讲解动态链接、静态链接

    参考动态链接 - 知乎 加上我自己的理解,比较好懂,但可能在细节方面有偏差,但总体是一致的 静态链接的背景 静态链接使得不同的程序开发者和部门能够相对独立的开发和测试自己的程序模块,从某种意义上来讲大 ...

最新文章

  1. PostgreSQL将表导出为CSV(服务器端、客户机端)完整版
  2. linux下安装oracle客户端,实现远程连接oracle库,导出数据表
  3. java finally在return_Java finally语句到底是在return之前还是之后执行?
  4. hibernate get方法有执行sql但是后台拿不到_「6」进大厂必须掌握的面试题-Hibernate...
  5. SQL 日期格式化处理.sql
  6. 304. 二维区域和检索 - 矩阵不可变
  7. python办公自动化案例-Python实战:自动化办公:Python 自动整理 Excel 表格
  8. 9个免费可商用的字体推荐
  9. 分镜头剧本模板、故事图模板
  10. vue下载图片到本地的方法
  11. 如何快速提取手机微信数据?
  12. 计算机函数sun怎么用,excel函数怎么使用
  13. 广西事业单位职称免计算机,2020广西事业单位职业能力倾向测试知识:为什么没有计算器?...
  14. UOJ#310-[UNR #2]黎明前的巧克力【FWT】
  15. 拉格朗日方法求最优解
  16. 量子物理 薛定谔的猫
  17. arange和range
  18. Springboot集成mybatis-plus报com.xly.entity.ClientNot Found TableInfoCache.
  19. python算法工程师书籍_我是如何成为算法工程师的,超详细的学习路线
  20. Python处理超强反爬(TSec防火墙+CSS图片背景偏移定位)

热门文章

  1. php中什么是时间戳,php中的时间戳转换函数是什么
  2. 计算机信息管理系统设计原理探究,计算机信息管理系统设计原理探究
  3. netty java_GitHub - leihuazhe/Java11-Netty-Demo: 基于Java11 构建的 netty 服务端客户端 模块化例子...
  4. python图片内容识别_ubuntu 安装 pytesseract 模块进行图片内容识别
  5. python lambda函数两个列表大小关系_python lambda结合列表推导式?
  6. python中getattr()的用法
  7. Keras——用Keras搭建线性回归神经网络
  8. NetCore MiddleWare 注意事项
  9. JAVA企业级应用服务器之TOMCAT实战
  10. 微信小程序wx.request请求用POST后台得不到传递数据