linux 编程之库的使用(学习笔记)
1.库概述
库可以分为静态库和动态库,静态库编译时必须存在,程序运行时不需要。
动态库也称共享库,其代码不会链接到目标文件之中,只有当动态库可访问时,应用程序才能正确地执行动态库函数。执行动态库有两种方式:隐式调用和显示调用。隐式调用也称共享库的静态加载,动态库函数在应用程序开始执行时会自动载入内存,进程结束时又自动卸载。编译方式与静态库一致。显示调用也称共享库的动态加载,调用时必须遵守dlopen等函数的规则实现调用。
在Unix中,使用ar命令可以创建或操作静态库,其格式为:
ar [drqtpmx] [option] archivefile objfile ….
参数 |
意义 |
-r |
将objfile文件插入静态库尾或替换静态库中同名文件 |
-x |
从静态库文件中抽取文件objfile |
-t |
打印静态库的成员文件列表 |
-d |
从静态库文件中删除文件objfile |
-s |
重置静态库文件索引 |
-v |
创建文件冗余信息 |
-c |
创建静态库文件 |
例子:抽取静态库/usr/lib/lic.a中的文件
# ar –x /usr/lib/libc.a
例子:组织文件xcvt.o和xstat.o创建静态库libccc.a。
# ar –r libccc.a xcvt.o xstat.o
2. 静态库编程
2.1 设计库源码
/******pr1.c*****/
void pirnt1()
{
printf(“this is the first lib src/n”);
}
/*******pr2.c***********/
void print2()
{
printf(“this is the second lib src/n”);
}
2.2. 编译生成库文件
gcc –O –c pr1.c pr2.c
分别产生pr1.o, pr2.o文件
链接静态库
ar –rsv libpr.a pr1.o pr2.o
2.3 测试程序源码
/********main.c************/
int main()
{
print1();
print2();
}
2.4 编译运行
gcc –O –o main main.c –L./ -lpr
3. 动态库编程
3.1 库源码
/*******pr1.c********/
int p=2;
void print()
{
printf(“This is the first dll src!/n”);
}
/*******pr2.c*********/
int p = 3;
void print()
{
printf(“This is the second dll src!/n”);
}
3.2 编译生成动态库
gcc –O –fpic –shared –o d1.so pr1.c
gcc –O –fpic –shared –o d2.so pr2.c
3.3. 动态库的隐式调用
/*****main.c*****/
int main()
{
print();
}
cp d1.so dll.so 或cp d2.so dll.so
编译:gcc –O –o main main.c ./dll.so
3.4. 动态库的显式调用
#include <dlfcn.h>
int main()
{
void *pHandle;//动态库句柄
void (*pFunc)();//函数指针
int *p;
pHandle = dlopen("./dll.so", RTLD_NOW);
if(!pHandle)
{
printf("Cann't find dll.so/n");
return 1;
}
pFunc = (void(*)())dlsym(pHandle, "print");
if(pFunc)
{
pFunc();
}
else
{
printf("Can't find func print/n");
}
p = (int *)dlsym(pHandle, "p");
if(p)
{
printf("p=%d/n", *p);
}
else
{
printf("Can't find int p/n");
}
dlclose(pHandle);
return 0;
}
转载于:https://my.oschina.net/fuyajun1983cn/blog/263799
linux 编程之库的使用(学习笔记)相关推荐
- 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试
按照这篇文章日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用里的代码,对下列方法进行单步调试: 因为我们调用的是 info 方法,所以生成的日志,leve ...
- 《小马哥讲Spring核心编程思想》-第一章学习笔记(1)
<小马哥讲Spring核心编程思想>-第一章学习笔记(1) 一.课程介绍 1.为什么要学习spring? 2.深入学习spring的难点有哪些? 3.课程的设计思路是怎样的? 二.内容综述 ...
- Linux内存从0到1学习笔记(4,TLB)
一.TLB简介 Kernel初始化的时候,会在初始化内存中创建页表:而处理器读取指令和数据的时候需要首先通过MMU查表得到物理地址,然后在访问物理地址读取指令或数据.MMU查表过程汇中需要4次访问内存 ...
- 关于《Python黑帽子:黑客与渗透测试编程之道》的学习笔记
本篇文章是学习<Python黑帽子:黑客与渗透测试编程之道>的笔记,会持续地将书上的代码自己敲一遍,从而让自己对Python的安全编程有更多的了解,同时希望各位可以给给建议,不足之处太多了 ...
- linux 多线程的基础 交通信号灯学习笔记 :信号详解
(以下均为<linux/UNIX 系统编程手册>中的部分笔记分享,和整理) 如果想要掌握多线程的编程方法,掌握信号量的学习尤为重要 首先第一点 ,还是对基础语义部分的理解,什么是信号: 信 ...
- python编程16章教程_Python学习笔记__16.2章 TCP编程
# 这是学习廖雪峰老师python教程的学习笔记 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算 ...
- 第2课第3节_Java面向对象编程_继承性_P【学习笔记】
摘要:韦东山android视频学习笔记 面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...
- linux oracle流复制文件,【学习笔记】Oracle ASM linux dd命令复制asm中文件 操作磁盘或者分区...
天萃荷净 使用dd复制asm中文件,随着数据库新版本的推广ASM肯定会越来越被重视,最近准备系统的学习下ASM,以备突发情况需要,这是asm深入学习笔记 1.查询ASM某个数据文件AU信息 SQL&g ...
- linux查看ogg客户端版本,OGG学习笔记05-OGG的版本
刚接触OGG的时候,很容易被众多的版本搞晕,虽然官方有提供各版本对应认证OS和DB的表格. 个人认为一个比较简单的方式,是直接去edelivery.oracle.com下载OGG,选定一个大版本后,这 ...
- python面向对象编程72讲_2020-07-22 Python学习笔记27类和面向对象编程
一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习. 声明:本人学习是在扇贝编程通过网络学习的,相关的知识.案例来源于扇贝编程.如果使用请说明来源. 第27关 类与面向对 ...
最新文章
- vim - ctags
- java 循环list 对象_java计算list集合中重复对象的次数及for循环内外创建对象
- JAVA之JVM知识汇总
- Qt Creator添加Qt Designer插件
- 近期状态几点简单思考
- 美国之旅-出发前的准备
- 语音识别行业成长红利期已过,行业寡头显现,小公司生存状况堪忧
- NVMe驱动详解系列——第一部分:NVMe驱动初始化和注销
- 网站搜索引擎优化外链工具
- 掘金往期沸点神评合集(别审过)
- 《可复制的领导力》脑图
- 数一段字母中各个字母的个数
- 查找python安装路径
- Vue处理后台返回List集合带有Object对象的数据
- Mongo DB Codex Debug 代码-Python语言版-立哥开发
- Zookeeper介绍(通俗易懂)
- Unity LensFlares(镜头炫光)踩坑以及解决总结
- 这才叫脑洞P图,简直看到怀疑人生!
- 计算机休眠usb充电,三星笔记本Win8如何开启USB接口休眠、关机时充电
- 数字签名、数字证书与CA
热门文章
- 请问如何更改dedecms“文件保存目录”的字符限制 ?
- 关于System Volume Information占用的大量磁盘空间
- GlusterFS配置管理(五)
- Linux C动态链接库实现一个插件例子
- 《C++ 开发从入门到精通》——第2章 C++的重要特质分析2.1 什么是面向对象(object-oriented)...
- Nginx的安装配置
- InputStream、OutputStream、String的相互转换(转)
- 64位windows驱动使用asm
- 网络层IP路由的负载均衡实现思路
- golang post get 请求 简介