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 编程之库的使用(学习笔记)相关推荐

  1. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试

    按照这篇文章日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用里的代码,对下列方法进行单步调试: 因为我们调用的是 info 方法,所以生成的日志,leve ...

  2. 《小马哥讲Spring核心编程思想》-第一章学习笔记(1)

    <小马哥讲Spring核心编程思想>-第一章学习笔记(1) 一.课程介绍 1.为什么要学习spring? 2.深入学习spring的难点有哪些? 3.课程的设计思路是怎样的? 二.内容综述 ...

  3. Linux内存从0到1学习笔记(4,TLB)

    一.TLB简介 Kernel初始化的时候,会在初始化内存中创建页表:而处理器读取指令和数据的时候需要首先通过MMU查表得到物理地址,然后在访问物理地址读取指令或数据.MMU查表过程汇中需要4次访问内存 ...

  4. 关于《Python黑帽子:黑客与渗透测试编程之道》的学习笔记

    本篇文章是学习<Python黑帽子:黑客与渗透测试编程之道>的笔记,会持续地将书上的代码自己敲一遍,从而让自己对Python的安全编程有更多的了解,同时希望各位可以给给建议,不足之处太多了 ...

  5. linux 多线程的基础 交通信号灯学习笔记 :信号详解

    (以下均为<linux/UNIX 系统编程手册>中的部分笔记分享,和整理) 如果想要掌握多线程的编程方法,掌握信号量的学习尤为重要 首先第一点 ,还是对基础语义部分的理解,什么是信号: 信 ...

  6. python编程16章教程_Python学习笔记__16.2章 TCP编程

    # 这是学习廖雪峰老师python教程的学习笔记 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算 ...

  7. 第2课第3节_Java面向对象编程_继承性_P【学习笔记】

    摘要:韦东山android视频学习笔记  面向对象程序的三大特性之继承性:继承性的主要作用就是复用代码.继承性也有一定的限制,如图一 图一 1.我们在第2课第2节_Java面向对象编程_封装性_P 中 ...

  8. linux oracle流复制文件,【学习笔记】Oracle ASM linux dd命令复制asm中文件 操作磁盘或者分区...

    天萃荷净 使用dd复制asm中文件,随着数据库新版本的推广ASM肯定会越来越被重视,最近准备系统的学习下ASM,以备突发情况需要,这是asm深入学习笔记 1.查询ASM某个数据文件AU信息 SQL&g ...

  9. linux查看ogg客户端版本,OGG学习笔记05-OGG的版本

    刚接触OGG的时候,很容易被众多的版本搞晕,虽然官方有提供各版本对应认证OS和DB的表格. 个人认为一个比较简单的方式,是直接去edelivery.oracle.com下载OGG,选定一个大版本后,这 ...

  10. python面向对象编程72讲_2020-07-22 Python学习笔记27类和面向对象编程

    一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习. 声明:本人学习是在扇贝编程通过网络学习的,相关的知识.案例来源于扇贝编程.如果使用请说明来源. 第27关 类与面向对 ...

最新文章

  1. vim - ctags
  2. java 循环list 对象_java计算list集合中重复对象的次数及for循环内外创建对象
  3. JAVA之JVM知识汇总
  4. Qt Creator添加Qt Designer插件
  5. 近期状态几点简单思考
  6. 美国之旅-出发前的准备
  7. 语音识别行业成长红利期已过,行业寡头显现,小公司生存状况堪忧
  8. NVMe驱动详解系列——第一部分:NVMe驱动初始化和注销
  9. 网站搜索引擎优化外链工具
  10. 掘金往期沸点神评合集(别审过)
  11. 《可复制的领导力》脑图
  12. 数一段字母中各个字母的个数
  13. 查找python安装路径
  14. Vue处理后台返回List集合带有Object对象的数据
  15. Mongo DB Codex Debug 代码-Python语言版-立哥开发
  16. Zookeeper介绍(通俗易懂)
  17. Unity LensFlares(镜头炫光)踩坑以及解决总结
  18. 这才叫脑洞P图,简直看到怀疑人生!
  19. 计算机休眠usb充电,三星笔记本Win8如何开启USB接口休眠、关机时充电
  20. 数字签名、数字证书与CA

热门文章

  1. 请问如何更改dedecms“文件保存目录”的字符限制 ?
  2. 关于System Volume Information占用的大量磁盘空间
  3. GlusterFS配置管理(五)
  4. Linux C动态链接库实现一个插件例子
  5. 《C++ 开发从入门到精通》——第2章 C++的重要特质分析2.1 什么是面向对象(object-oriented)...
  6. Nginx的安装配置
  7. InputStream、OutputStream、String的相互转换(转)
  8. 64位windows驱动使用asm
  9. 网络层IP路由的负载均衡实现思路
  10. golang post get 请求 简介