【转】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,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...
随机推荐
- (十七)super关键字(转)
--本文摘自孤傲苍狼博客. 一.super关键字
- 心の壁 From EOE:Air / 真心为你
https://www.bilibili.com/bangumi/media/md10272/ 真嗣:我问你. 凌波:什么? 真嗣:梦到底是什么呢? 凌波:梦? 真嗣:我不太明白什么是现实. 凌波:你 ...
- (CVE-2017-8464)LNK文件远程代码执行
漏洞详细 北京时间2017年6月13日凌晨,微软官方发布6月安全补丁程序,“震网三代” LNK文件远程代码执行漏洞(CVE-2017-8464)和Windows搜索远程命令执行漏洞(CVE-2017- ...
- kali安装chrome
文章搬到自己的网站上,如下: http://101.132.137.140:202/archives/2019-11-25
- 查询父节点parentNode
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!DOCTYPE htm ...
- MyBatis框架总结
一. MyBatis简介 MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...
- 第一周006------Java 三大版本含义——Java ME和安卓开发的关系
Java ME 和安卓开发没有任何关系 Java SE(Java Standard Edition):标准版,定位在个人计算机的应用(桌面系统 QQ 游戏)Java EE(Java Enterp ...
- 【洛谷】P3980 [NOI2008]志愿者招募
[洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...
- Spring Boot系列教程十二:Spring boot集成Redis
一.创建项目 项目名称为 "springboot_redis",创建过程中勾选 "Web","Redis",第一次创建Maven需要下载依赖 ...
- Java中数据存储分配
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...