Linux下动态库的使用

时间:2022-09-21 13:33:27

1、生成动态库:

gcc -fPIC -shared -o libdemo.so demo.c

考虑程式库major的升级会破坏兼容性;而minior的升级则可能不会,一般建议用以下方式来生成动态库。

gcc -fPIC -shared -Wl,-soname,libdemo.so.major -o libdemo.so.major.minor demo.c

可以通过ldconfig -n 来查看动态库的链接

2、使用动态库

头文件引入时必须,然后再加入编译选项-ldemo即可(demo为动态库的名)。

3、Linux的标准库存在3种链接方式:全静态 , 半静态,全动态,根据参考文献1的结论,大部分情况建议采用半静态方式。

4、三种标准库链接方式的编译器选项及优缺点如下:

标准库链接方式 示例编译器选项 优点 缺点
全静态 -static -pthread -lrt -ldl 不会发生应用程序在 不同 Linux 版本下的标准库不兼容问题。 生成的文件比较大,
应用程序功能受限(不能调用动态库等)
全动态 -pthread -lrt -ldl 生成文件是三者中最小的 比较容易发生应用程序在 
不同 Linux 版本下标准库依赖不兼容问题。
半静态 (libgcc,libstdc++)

-static-libgcc -static-libstdc++

-L. -pthread -lrt -ldl

灵活度大,能够针对不同的标准库采取不同的链接策略,
从而避免不兼容问题发生。
结合了全静态与全动态两种链接方式的优点。
比较难识别哪些库容易发生不兼容问题,
目前只有依靠经验积累。
某些功能会因选择的标准库版本而丧失。

5、 半静态链接方式,主要在于其还需要在链接前增加额外的一个步骤:
ln -s `g++ -print-file-name=libstdc++.a`,作用是将 libstdc++.a(libstdc++ 的静态库)符号链接到本地工程链接目录。
-print-file-name 在 gcc 中的解释如下:
-print-file-name=<lib> Display the full path to library <lib>

6、gcc的编译器选项说明:

-static:静态链接所有库

-static-libgcc:静态链接 gcc 库 
-static-libstdc++:静态链接 c++ 库

参考文献:

1、http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/index.html

2、http://www.cnblogs.com/skynet/p/3372855.html

3、http://blog.csdn.net/zjg555543/article/details/7514946

Linux下动态库的使用的更多相关文章

  1. 谈谈Linux下动态库查找路径的问题 ldconfig LD&lowbar;LIBRARY&lowbar;PATH PKG&lowbar;CONFIG&lowbar;PATH

    谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH  PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.ph ...

  2. Linux下动态库生成和使用

    Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...

  3. 深入理解LINUX下动态库链接器&sol;加载器ld-linux&period;so&period;2

    [ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...

  4. Linux下动态库查找路径的问题

    说到和动态库查找路径相关的问题,总体上可以分为两类:    第一类: 通过源代码编译程序时出现的找不到某个依赖包的问题,而如果此时你恰好已经按照它的要求确确实实.千真万确.天地良心地把依赖库给装好了, ...

  5. 谈谈Linux下动态库查找路径的问题

    学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续"上路".回想起自己当年刚接触Linux时,不管是用源码包编译程序,还是程序运行时出现的和动态库的各种恩恩怨怨,心里 ...

  6. &lbrack;转&rsqb;谈谈Linux下动态库查找路径的问题

    http://blog.chinaunix.net/uid-23069658-id-4028681.html 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚 ...

  7. 转:谈谈Linux下动态库查找路径的问题

    http://blog.chinaunix.net/uid-23069658-id-4028681.html 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚 ...

  8. 【linux】linux下动态库so文件的一些认识

    来源:http://mypyg.iteye.com/blog/845915 so其实就是shared object的意思.今天看了上面的博客,感觉好吃力.赶紧做个笔记记录一下.下面的内容大多都是连接中 ...

  9. LINUX下动态库及版本号控制

    针对同一动态组件的不同版本链接和加载. 一.概念                  DLL HELL字面意思是DLL"灾难",是由于com组件(动态库)升级引起的程序不能运行的情况 ...

  10. linux下动态库so文件的一些认识

    转自:http://mypyg.iteye.com/blog/845915 个人创作,欢迎指错. 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识.  ...

随机推荐

  1. 基于&period;NET的大型Web站点*架构分析&lpar;转&rpar;

    Stack Overflow网址:http://*.com/ 当前访问量:每月9500PV(每天300多万PV) 当前Alexa排名:149 所用.NET技术:C#.Visua ...

  2. poj3349

    http://poj.org/problem?id=3349 每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的.输入多个雪花,判断是否有形状一致的雪 ...

  3. libpcap报文解析&colon; ipv4、ipv6(待优化)

    #include <string.h> #include <stdlib.h> #include <pcap.h> #include <netinet/in. ...

  4. WPF的数据绑定详细介绍

    数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程. 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改. 数据绑定可能还意味着如果视觉元素中数据的 ...

  5. C&num; 运行时通过鼠标拖动改变控件的大小

    来源:http://blog.csdn.net/yanleigis/article/details/1819447 using System; using System.Collections.Gen ...

  6. 最全linux命令

    arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI ...

  7. 2017-3-29&sol;HTTP协议1

    1. 讲讲你对http的理解. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议,是一个客户端和服务器端请求和 ...

  8. 餐巾计划问题 zwk费用流解法

    «问题描述:一个餐厅在相继的N 天里,每天需用的餐巾数不尽相同.假设第i天需要ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧餐巾送到快洗部,洗一块需m天,其费用 ...

  9. js 生成随机颜色

    var getRandomColor = function(){ return '#'+(Math.random()*0xffffff<<0).toString(16); } <&l ...

  10. 对drf的初步认识

    web应用模式 1.前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高. 这种应用模式比较适合纯网 ...