Linux静态库和共享库【转】

简介:

转自:http://www.cnblogs.com/zlcxbb/p/6806269.html

1.什么是静态库

静态库类似windows中的静态lib

关于windows中的静态lib,可参考 Windows动态链接库DLL 

特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中。
只在编译时使用,执行时不再需要该静态库。

2.静态库编写
示例如下:
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]; }
复制代码
复制代码

使用AR工具创建静态库文件:

3.静态库使用
示例如下:
test2.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)-static参数,表明是静态链接,编译出的是完整的可执行目标文件。
2)当链接器进行链接时,会判断main函数里调用了addvec.o中的addvec函数,
没有调用multvec.o中的任何函数,所以,链接器只会拷贝addvec.o到可执行文件。

4.什么是共享库
共享库类似windows中的动态链接库dll

特点:包含函数代码声明和实现。
只在运行时使用,由动态链接器链接和加载。

根据链接和加载共享库的时机可分为以下两类:
1)自身加载型共享库。
2)运行时加载型共享库

5.自身加载型共享库。
类似windows中的隐式链接
链接时,将共享库的声明信息链接到可执行文件,
应用程序加载时,动态链接库解析声明信息,加载共享库的实现到存储器,重定位应用程序中声明信息到实际地址。

6.自身加载型共享库使用示例
使用-shared参数,指示编译器创建一个共享库。
如下所示,我们创建了一个共享库,并通过自身加载型来使用该共享库。

1)-fPIC参数,指示编译器生成代码无关的代码
2)在链接时,没有拷贝共享库libvec.so的实现,只拷贝了一些重定位和符号表信息
3)程序加载时,动态链接器会解析共享库libvec.so中代码和数据的引用,重定位完成链接任务。
重定位libvec.so的文本和数据到存储器段
重定位p2中引用的libvec.so到以上存储器段
最后链接器将控制传递给程序,此时,共享库的位置就固定了。

7.运行时加载型共享库
类似windows中的显式链接
无需编译时链接,可在运行过程中加载和卸载共享库。

8.运行时加载型共享库使用示例
Linux提供了一组运行过程中加载和卸载共享库的API,如下所示:
#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 
复制代码
复制代码

根据以上API,我们可以方便地加载和卸载共享库,如下所示:

复制代码
复制代码
#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参数,表示程序运行时需要用到共享库

参考:http://www.cnblogs.com/shijingjing07/p/5608104.html





本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/7655109.html,如需转载请自行联系原作者
相关文章
|
4月前
|
Linux 编译器 vr&ar
Linux的动态库与静态库
静态库在编译时直接嵌入到最终的可执行文件中。
118 0
|
10月前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
1975 141
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
400 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
509 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
102 0
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
145 0
|
Linux 编译器 vr&ar
【Linux】静态库和动态库
本文详细介绍了Linux系统中静态库和动态库的概念、区别、制作与使用方法,包括它们在链接时的区别、加载机制以及优缺点。
220 0