UNIX 动态库和静态库
动态库,又叫做共享对象库,以.so结尾。使用动态库时,编译器并不直接在编译的时候将代码嵌入到目标文件中,而是等到运行时调用相应的函数,才加载代码。
静态库,又叫做归档文件,以.a结尾。使用静态库的时候,编译器在编译过程中直接将代码嵌入到目标文件中,所以一旦完成编译,那么静态库可以不需要了。
1、编写静态库以及使用静态库
首先编写hello.h文件。
然后编写hello.c文件。
然后编写main.c。
我们使用gcc -c hello.c得到二进制目标文件hello.o,然后使用ar命令生成静态链接库libhello.a。
ar -cru libhello.a hello.o
指定链接库对main.c进行编译链接生成可执行文件main.out
gcc -o main.out -L. -lhello main.c
执行main.out文件得到结果:
这样就完成从编写静态链接库到使用静态库的全部过程。
2、编写动态库并且使用动态库
现在我们来完成动态链接库的编写。
还是上面的hello.h hello.c main.c文件,我们生成动态链接库libhello.so。
使用命令gcc -c hello.c -fPIC生成hello.o目标文件,使用gcc -shared将hello.o加入到动态库libhello.so中,
gcc -shared hello.o -o libhello.so
编译链接main.c
gcc main.c -o main.out -L. -lhello
配置LD_LIBRARY_PATH的内容包含当前目录:
export LD_LIBRARY_PATH=/usr/local/lib
:.
执行main.out得到下面的运行情况。
三、程序中显式加载动态库
还是按照前面的步骤,生成动态库libhello.so,然后在main.c程序中显式的加载动态库,具体见代码:
使用gcc -ldl main.c -o main.out生成可执行程序。执行main.out的时候也需要寻找动态库的路径中包含当前目录,也就是同样使用export LD_LIBRARY_PATH=.。然后执行可执行程序得到的结果与2中的结果相同。
void *dlopen(const char *filename, int flag);
其中flag有:RTLD_LAZY RTLD_NOW RTLD_GLOBAL,其含义分别为:
RTLD_LAZY:在dlopen返回前,对于动态库中存在的未定义的变量(如外部变量extern,也可以是函数)不执行解析,就是不解析这个变量的地址。
RTLD_NOW:与上面不同,他需要在dlopen返回前,解析出每个未定义变量的地址,如果解析不出来,在dlopen会返回NULL,错误为:
: undefined symbol: xxxx.......
RTLD_GLOBAL:它的含义是使得库中的解析的定义变量在随后的其它的链接库中变得可以使用。
UNIX 动态库和静态库相关推荐
- 动态库、静态库、运行时库、引入库之间的区别
动态库.静态库.运行时库.引入库之间的区别 杂集.捡对口味的看看吧. 转自:http://lingualspark.blog.sohu.com/94785899.html 运行时库:Unix中一个典型 ...
- gcc g++ Linux下动态库_静态库
关于Unix静态库和动态库的分析 基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在 ...
- linux系统中 库分为静态库和,Linux系统中“动态库”和“静态库”那点事儿-【经典好文】...
今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在linux操作系统中,普遍使用E ...
- Linux 动态库和静态库
From:http://blog.csdn.net/u010977122/article/details/52958330 From:http://blog.163.com/xychenbaihu@y ...
- mysql.h 动态编译命令_Linux环境编译动态库和静态库总结
对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...
- Linux系统中动态库和静态库的区别
Linux系统中"动态库"和"静态库"那点事儿 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源 ...
- Linux系统中的“动态库”和“静态库”
Linux系统中的"动态库"和"静态库" 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable a ...
- Linux系统中“动态库”和“静态库”那点事儿
转自:https://blog.csdn.net/u010977122/article/details/52958330#commentBox 今天忙着编译库文件,中间遇到不少问题,看到这篇文章不错, ...
- linux 动态库和静态库分析实例
今天忙着编译库文件,中间遇到不少问题,看到这篇文章不错,就转载过来了,后面我会整理下今天的问题,从网上下载了一个开源库,如何进行编译,如何加载到我们的工程中. 今天我们主要来说说Linux系统下基于动 ...
- Linux系统中的动态库和静态库
来源: wjlkoorey258 链接: http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库 ...
最新文章
- 技术图文:匿名方法是怎样演变为Lambda表达试的?
- Js Call方法详解(js 的继承)
- 论字符界面和WEB界面配置的优缺点
- IDEA无法识别pom.xml文件,内容全部显示为灰色,或者无颜色
- Java剖析工具JProfiler入门使用教程:离线剖析和触发器
- this指针的用法详解
- java 反射 静态域_java 内存 堆 栈
- SOA架构师注意的问题
- APUE第二版源码编译问题解决
- 《Programming WPF》学习(一)Hello WPF
- SQL数据库语言基础之SQL Server自带数据类型、自定义数据类型与使用、创建修改数据表
- Python实现删除字符串中的字符
- [Swift A] - Using Swift with Cocoa and Objective-C--Mix and Match
- html 星空效果,html5 canvas炫酷旋转银河系星空背景特效
- 金三银四面试季—20道精选JVM重点面试问题!
- vue非父子组件间传参问题
- 全球各国语言代码缩写与国家对照表
- LeetCode刷题之1818. 绝对差值和
- winpCap中compile和nocap函数
- 清华操作系统实验lab1
热门文章
- visualSVN仓库创建及操作
- JasperReport:概述
- Servlet_概述
- ORACLE 表类型 OLTP和OLAP
- c语言 乱码转化为16进制_面向小白的C语言科普教程(一)文件和扩展名、编码和十六进制...
- 【SpringBoot零基础案例08】【IEDA 2021.1】SpringBoot获取核心配置文件application.properties中的自定义配置
- linux下c的学习
- 阿里:马云从未转让和退出淘宝股份 也没有这个打算
- React实践(一)——webpack4搭建开发环境
- Python语言程序设计基础(2)—— Python程序实例解析