文档章节

GCC中同时使用动态和静态库链接的编译

晓亮1210
 晓亮1210
发布于 2013/10/30 12:45
字数 545
阅读 3905
收藏 9
   如何同时同时使用动态和静态库链接,在GCC指令参数中具体参数如下:
    -Wl,-Bstatic -L/usr/local/sqlite-arm-linux/.libs -lsqlite -Wl,-Bdynamic -L/usr/local/arm/3.3.2/lib
 
 具体用途解释:sqlite库静态连接,其它库动态连接。
-Wl,-Bstatic 与-Wl,-Bdynamic参数,从字面意义上可以理解,有静态和动态的意思,但是具体的真正规则在查找了GCC的原版手册上有说明。
 
原文:
Note - if the linker is being invoked indirectly, via a compiler driver (eg gcc) then all the linker command line options should be prefixed by -Wl, (or whatever is appropriate for the particular compiler driver) like this:

gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup
  
This is important, because otherwise the compiler driver program may silently drop the linker options, resulting in a bad link.

实际上主要针对隐式应用LINKER的参数,用“-Wl,”来标识,,“--startgroup foo.o bar.o -Wl,--endgroup”表示一组,,-Bstatic -Bdynamic 作为关键字与-WL,不可分,在GCC连接库时,默认链接是动态链接,现在用上面的指令限制在链接sqlite库时采用静态链接。
 
-Bstatic 还有三个写法: -dn和-non_shared 和-static

-Bdynamic 还有两个写法:-dy 和-call_shared

上面参数“-L/usr/local/sqlite-arm-linux/.libs ”放不放在-Wl,...之间无所谓,因为它只是提供了sqlite动静态库的位置。可以改成下面的参数形式,更直观。

-L/usr/local/sqlite-arm-linux/.libs -L/usr/local/arm/3.3.2/lib -Wl,-dn -lsqlite -Wl,-dy

-Wl,-dn 和 -Wl,-dy成对出现才能起到标题所说的作用。  

关于-Wl,后面的参数还有很多,全部明白我也不能。

还有一个问题值得注意,在-Wl,后面不能有空格,否则会出错!

关于-Wl,option 说明还有一段说明

GCC命令参数的英文原文

-Wl,option

Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas.

传递参数option作为linker的一个参数,如果option包含逗号,将在逗号处分割成几个参数。

例如:

-Wl,-dn –lsqlite


-dn 开始静态链接


-lsqlite 静态链接sqlite库


静态链接完后,然后需要动态链接


-Wl,-dy


重新开始动态链接。

© 著作权归作者所有

上一篇: DNS协议
下一篇: rpm打包
晓亮1210
粉丝 7
博文 83
码字总数 76483
作品 0
通州
程序员
私信 提问
加载中

评论(1)

LGC
LGC
nice!
lib和dll的区别,生成以及使用详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/googler_offer/article/details/88526962 静态库:在链接步骤中,连接器将库文件取得所需的代码,复制到生成的...

googler_offer
03/13
0
0
linux 下静态库和动态库详解

一、基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的平台不同(主要是编...

CoderFarmer
2013/07/03
0
0
gcc下如何主动创建并使用自己的动态库或静态库

库:本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行,分为静态库和动态库两类。另外,需要知道的是,由于windows和Linux是两款操作系统,因此,二者的库是不兼容的。 静态函...

暮回_梓
2018/06/26
0
0
gcc下如何主动创建并使用自己的动态库或静态库

库:本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行,分为静态库和动态库两类。另外,需要知道的是,由于windows和Linux是两款操作系统,因此,二者的库是不兼容的。 静态函...

暮回_梓
2017/03/03
0
0
创建C语言静态库与动态库

“程序库”就是包含了一些同音函数的数据和二进制可执行机器码的文件。这些文件是目标文件的一种,其不能单独执行。但是如果将其与其他的可执行代码结合起来就可以执行。这些目标文件通常可以...

大道无名
2016/10/24
417
0

没有更多内容

加载失败,请刷新页面

加载更多

社区投稿 | 线程简介和 MySQL 调试环境搭建

作者:高鹏 文章末尾有他著作的《深入理解MySQL主从原理 32讲》,深入透彻理解MySQL主从,GTID相关技术知识。 本文节选自《深入理解MySQL主从原理》第29节 注意:本文分为正文和附件两部分,...

爱可生
22分钟前
5
0
DDOS攻击可以分为什么类型?怎么样才能解决?

DDoS 是一种多源网络攻击,其目的是针对终端用户扰乱其网络的资源或服务。其不断进化的复杂性能够造成各种各样的伤害,例如欺诈以及勒索等。DDoS 攻击通常透过多重受损的系统或者装置注入殭尸...

云漫网络Ruan
25分钟前
5
0
从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

作者| 阿里巴巴资深技术专家、CNCF 9个 TCO 之一 李响 一、什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译...

阿里巴巴云原生
25分钟前
4
0
修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)

上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationBeanPostProcessor类的代码,在里面打印...

程序员欣宸
28分钟前
3
0
MongoDB集群配置

MongoDB集群配置 2019年06月30日 13:21:05 2014Team 阅读数 77更多 分类专栏: MongoDB 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文...

linjin200
29分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部