【转】Linux编译链接问题----静态库和动态库
Linux静态库和动态库的命名规则
静态函数库
静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中。
a) 优点:
编译后,可执行文件不需要外部支持;
b) 缺点:
生成的可执行程序大;静态库改变了,就需要重新编译可执行程序。
动态函数库
动态库的名字一般是libxxx.so,相对于静态库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里面相应的函数,因此使用动态函数库生成的可执行文件比较小。由于函数库没有编译进可执行程序,而是程序运行时动态的申请调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变也不会影响可执行程序,针对可执行程序的动态函数库升级也比较容易。
优点:
- 实现进程的资源共享,当程序在运行的时候需要调用某个动态链接库函数时候,OS会先查看所有正在运行的程序,看内存里面是否已经有此函数的拷贝了,有责共享那个拷贝,没有才会链接载入,这样会大大节省OS的内存资源;
- 升级容易,升级动态链接库即可,不需要重新编译可执行程序;
Gcc/g++的编译链接:
通常,对函数的链接是在编译期的时候完成的,所有相关的对象文件与相关联的library被链接成一个可执行文件,这就是使用静态库的编译过程,而动态库技术:对一些库函数的链接载入推迟到程序运行的时候。
但是,不管是使用静态库还是使用动态库,这些库文件都是由*.o文件生成的,在给编译器gcc传不同的参数,就会生成相应的静态库或者是动态库了。
静态库和动态库的创建过程:
a) 创建静态库:
在linux环境下,创建静态库是使用ar命令,具体的选项可以man查看下,例子:
ar -rt libtest.a error.o show.o test.o
这样就创建了libtest.a静态库文件。
b) 创建动态库:
使用gcc编译.c文件的使用,使用-fPIC标签,然后在使用*.o文件生成动态库文件的时候,传递-shared标签给gcc,例子:
Gcc –fPIC –c file1.c
Gcc -fPIC -c file2.c
Gcc –shared libtest.so file1.o file2.o
这样就创建了libtest.so动态库文件。
使用静态库和动态库的方法:
动态库文件和静态库文件的使用方法基本上差不多,在gcc的command里面使用-Lpath和-lxxx标签:
Gcc file1.o file2.o –Lpath –lxxx –o yourprogrammer
编译器会先到path下面寻找libxxx.so文件,如果没有找到,继续寻找libxxx.a文件。
那么动态库函数文件,是在程序运行的过程中决定是否载入的,那么我们需要告诉编译器,去哪里能找到动态库函数文件,在linux或者类unix操作系统里面是使用LD_LIBRARY_PATH环境变量来实现的。
That’s all。
【转】Linux编译链接问题----静态库和动态库的更多相关文章
- Linux编译多个不同目录下的文件以及静态库、动态库的使用
先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 ht ...
- Linux上静态库和动态库的编译和使用
linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...
- linux上静态库和动态库的编译和使用(附外部符号错误浅谈)
主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考 ...
- Linux下编译、使用静态库和动态库 自己测过的
每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
- linux 编译,链接和加载
1. 序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...
随机推荐
- (八)UML之状态图
一.概念 状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Act ...
- [Vue warn]: Do not use built-in or reserved HTML elements as component id: content
错误如下: 报错原因: 不能使用内建标签,组件不能和html标签重复. 解决办法: 把name改成mContent解决.
- vue-cli 引入stylus报错
在App.vue页面添加以下代码报错: <style lang="stylus" rel="stylesheet/stylus"> </sty ...
- D-Link系列路由器漏洞挖掘
参考 http://www.freebuf.com/articles/terminal/153176.html https://paper.seebug.org/429/ http://www.s3c ...
- iOS-系统bool理解
typedef signed char BOOL; #if !defined(YES) #define YES (BOOL)1 #endif #if !defined(NO) #defin ...
- AI新生代“教父”崛起,或成就迈向具有类人意识机器的一大步
<麻省理工科技评论>公布了 2018 年全球十大突破性技术,“对抗性神经网络”即“生成对抗网络”作为突破性人工智能技术赫然上榜.这家全球最顶级科技杂志编辑部对这项革命性技术给出的评价是:它 ...
- 《Tsinghua os mooc》第11~14讲 进程和线程
第十一讲 进程和线程 进程 vs 程序 程序 = 文件 (静态的可执行文件) 进程 = 执行中的程序 = 程序 + 执行状态 进程的组成包括程序.数据和进程控制块 同一个程序的多次执行过程对应为不同进 ...
- python 如何让字符串的不具有转义的反斜杠具有转义功能
用 codecs, 大概是這樣子: # python3 code import codecs print(codecs.getdecoder("unicode_escape")(' ...
- 方法区(关于java虚拟机内存的那些事)
<深入理解 java 虚拟机> 读书扩展 作者:淮左白衣 写于 2018年4月13日21:26:05 目录 方法区 图例(方法区中都保存什么) 类型信息 类型的常量池 (即运行时常量池) ...
- 第6章:LeetCode--数组(冒泡排序、快速排序)
11. Container With Most Water class Solution { public: int maxArea(vector<int>& height) { ...