【转】Linux 静态库与共享库的使用
原文网址:http://blog.csdn.net/heyabo/article/details/11688517
申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析。虽然原理,思想差不多,但是细节却各有不同。
一、静态库
- // addvec.c
- void addvec(int* x, int* y, int*z, int n)
- {
- int i=0;
- for(; i< n;++i)
- z[i] = x[i] + y[i];
- }
- // multvec.c
- void multvec(int*x, int* y, int* z, int n)
- {
- int i = 0;
- for(; i < n; ++i)
- z[i] = x[i] * y[i];
- }
- /* main2.c */
- #include <stdio.h>
- int x[2] = {1, 2};
- int y[2] = {3, 4};
- int z[2]={0};
- int main()
- {
- addvec(x, y, z, 2);
- printf("z = [%d %d]\n", z[0], z[1]);
- return 0;
- }
- 1)重定位libc.so的文本和数据到某个存储器段;
- 2)重定位libvector.so的文本和数据到另一个存储器段;
- 3)重定位p2中所有对libc.so和libvector.so定义的符号的引用。
- #include<dlfcn.h>
- /* 加载和链接共享库 filename
- filename:共享库的名字
- flag有:RTLD_LAZY, RTLD_NOW,二者均可以和RTLD_GLOBAL表示取或
- */
- void *dlopen(const char *filename, int flag); // 若成功则返回执行句柄的指针,否则返回NULL
- /*根据共享库操作句柄与符号,返回符号对应的地址
- handle:共享库操作句柄
- symbol:需要引用的符号名字
- */
- void *dlsym(void *handle, char *symbol); // 若成功则返回执行符号的指针(即地址),若出错则返回NULL
- /* 如果没有程序正在使用这个共享库,卸载该共享库 */
- int dlclose(void *handle); // 若卸载成功,则返回0,否则返回-1
- /* 捕捉最近发生的错误 */
- const char *dlerror(void); // 若前面对dlopen,dlsym或dlclose调用失败,则返回错误消息,否则返回NULL
例子:
- #include <stdio.h>
- #include <stdlib.h>
- #include <dlfcn.h>
- int x[2] = {1, 2};
- int y[2] = {3, 4};
- int z[2] ={0};
- int main()
- {
- void *handle;
- void (*addvec)(int *, int *, int *,int);
- char *error;
- handle = dlopen("./libvector.so", RTLD_LAZY);
- if(!handle){
- fprintf(stderr, "%s\n", dlerror());
- exit(1);
- }
- addvec = dlsym(handle, "addvec");
- if((error = dlerror()) != NULL){
- fprintf(stderr, "%s\n", dlerror());
- exit(1);
- }
- addvec(x, y, z, 2);
- printf("z = [%d %d]\n", z[0], z[1]);
- if(dlclose(handle) < 0){
- fprintf(stderr, "%s\n", dlerror());
- exit(1);
- }
- return 0;
- }
运行结果:-ldl参数:表示生成的对象模块需要用到共享库
Referebces:
1.《深入理解计算机系统》第7章:链接 P448-P479
2. 静态库、共享库、动态库的创建和使用 :http://bbs.chinaunix.net/thread-2037617-1-1.html
3. Linux 动态库剖析:http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/
【转】Linux 静态库与共享库的使用的更多相关文章
- Linux 静态库与共享库的使用
申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...
- linux下的静态库和共享库
转载&&增加: 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...
- Linux下库的制作(静态库与共享库)
库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...
- 第二课 GCC入门之静态库以及共享库
序言: 前面一课讲了gcc的简单入门,包括gcc编译步骤:预处理:编译:汇编:链接.今天这节课就来讲下linux的库也欢迎大家吐糟共同学习. 原理: linux系统中分为2种库:静态库和共享库.静态库 ...
- Linux下Qt创建共享库与链接共享库详解
随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库:或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库.本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的 ...
- Linux静态库和共享库
1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...
- Linux静态库和共享库【转】
转自:http://www.cnblogs.com/zlcxbb/p/6806269.html 1.什么是静态库 静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Wi ...
- Linux命令(十二)制作静态库和共享库
1. 静态库 静态库文件命名:libxxxx.a 1.1 步骤: ar rcs libCalc.a *.o 1.2 用nm查看文件内容 1.3 发布并使用 gcc main.c -o mycpp.ou ...
- gcc创建静态库和共享库
静态库和动态(共享)库静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小,其 ...
随机推荐
- 设计模式--状态模式C++实现
1定义 当一个状态的内在状态改变时允许其行为改变,这个对象看起来像改变了其类 2类图 角色分析 State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换 ConcreteS ...
- poj2823单调队列
这个裸题,滑动窗口求最大最小值,单调队列来两边,一次单调递增q[s]就是最小值,一次单调递减q[s]就是最大值 cin会超时,解除同步也没用... #include<map> #inclu ...
- HDU 5699 二分+线性约束
http://acm.hdu.edu.cn/showproblem.php?pid=5699 此题满足二分性质,关键在于如何判断当前的时间值可以满足所有的运送方案中的最长的时间. 对于每一次枚举出的k ...
- day17 Django学习三
参考博客: http://www.cnblogs.com/wupeiqi/articles/5237704.html http://www.cnblogs.com/wupeiqi/articles/5 ...
- JDK的多线程与并发库
1.创建多线程 public class MultiThread { public static void main(String[] args) { // 通过继承Thread类 Thread th ...
- html5: 新特性(表单)
表单: 在html4中,表单内的从属元素必须写在表单内部.在html5中,可以吧他们书写在页面任何位置,然后指定form属性,属性值为表单ID,这样就指定表单了. formaction,formmet ...
- Redis数据库的学习及与python的交互
1. 数据库简介: 当前主要使用两种类型的数据库:关系型数据库(RDBMS).非关系型数据库(NoSQL); (1). 关系型数据库RDBMS: 是建立在关系模型基础上的数据库,借助于集合代数等数学概 ...
- python + sklearn ︱分类效果评估——acc、recall、F1、ROC、回归、距离
之前提到过聚类之后,聚类质量的评价: 聚类︱python实现 六大 分群质量评估指标(兰德系数.互信息.轮廓系数) R语言相关分类效果评估: R语言︱分类器的性能表现评价(混淆矩阵,准确率,召回率,F ...
- 【机器学习PAI实践十】深度学习Caffe框架实现图像分类的模型训练
背景 我们在之前的文章中介绍过如何通过PAI内置的TensorFlow框架实验基于Cifar10的图像分类,文章链接:https://yq.aliyun.com/articles/72841.使用Te ...
- 求序列完美度(trie+贪心)
题目链接: 求序列完美度 题目描述 给出由n个数组成的序列s,规定第i个数s[i]到第j个数s[j]组成的子序列的完美度为该子序列中所有数的和与任意一个不在该子序列中的数进行异或运算得到的值中的最大值 ...