linux下动态库和静态库制作与调用

author author     2022-12-06     663

关键词:

Linux下动态库和静态库制作与调用

1.动态库和静态库简介

   静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。

      动态库又称动态链接库英文为DLL,是指DynamicLinkLibrary 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。

      静态库:在编译的时候加载生成目标文件,在运行时不用加载库,在运行时对库没有依赖性。

      动态库:在目标文件运行时加载,对库有依赖性。

 1.1 Linux下动态库和静态库命令方式

 动态库命名方式:libxxx.so。其中so是shared objecd的缩写,即可以共享的目标文件,lib为库的固定格式,xxx为库名称,.so为动态库后缀。

  动态库命名方式:libxxx.a xxx静态库名称。Linux 上的静态库,其实是目标文件的归档文件。

 1.2 编译生成共享库示例

  命令:gcc -fPIC -shared -o libxxx.so xxx.c

      此过程分为编译和链接两部分,-fPIC是编译选项,PIC表示要生成位置无关的代码,这是动态库的特性,-shared是链接选项,告诉gcc生成动态库而不是可执行文件。

    上述命令等同于:

    gcc -fPIC -c xxx.c

    gcc -shared -o libxxx.so xxx.o

   如下代码为例实现动态库编译与调用:

Linux下动态库和静态库制作与调用_静态库

[wbyq@wbyq shared]$ gcc -fPIC -shared -o libmyfile.so ./src/*.c -I./include

  gcc -I  指定头文路径

 1.3 动态库调用

[wbyq@wbyq shared]$ gcc main.c -Iinclude -lmyfile -L./lib

 gcc -L 指定动态库路径

 gcc -l 指定动态库名字

 1.4 程序运行

[wbyq@wbyq shared]$ ./a.out 
./a.out: error while loading shared libraries: libmyfile.so: cannot open shared object file: No such file or directory

  错误原因:

  系统动态库默认搜索路径: /lib 和 /usr/lib

  解决办法1:将libmyfile.so 拷贝到/usr/lib或者/lib目录下。

  解决办法2:修改系统环境变量,动态库环境变量:LD_LIBRARY_PATH

  修改环境变量示例:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/ubuntu/shared/lib

  注意:在命令行修改环境变量只对当前终端有效。

  解决办法2:修改系统启动文件

  Ubuntu下开机普通用户启动文件:~/.bashrc ~/.profile

  管理员用户:/.profile

  修改~/.bashrc文件:

Linux下动态库和静态库制作与调用_动态库_02

  同步文件:source ~/.bashrc

2 linux静态库创建与调用

 2.1 linux静态库的命令规则

  静态库libxxx.a xxx静态库名称。Linux 上的静态库,其实是目标文件的归档文件。

 2.2 linux静态库创建步骤

  (1)编写源文件,通过gcc -c生成目标文件。
  (2)用ar归档目标文件,生成静态库。
  (3)配合静态库,写一个使用静态库中函数的头文件。
  (4).使用静态库时,在源码中包含对应头文件,链接是记得链接自己的库。

 2.3 生成静态库

[wbyq@wbyq shared]$ gcc -c src/*.c -Iinclude  #生成 .o文件
[wbyq@wbyq shared]$ ar crv -o ./lib/libmyfile2.a ./*.o #生成静态库
a - ./my_cat.o
a - ./my_cp.o
a - ./my_du.o

 2.4 调用静态库和查看动态库信息

[wbyq@wbyq shared]$ ar t ./lib/libmyfile2.a  #查看静态库信息
my_cat.o
my_cp.o
my_du.o
[wbyq@wbyq shared]$ gcc main.c -L./lib -lmyfile2 -o app -Iinclude #调用静态

3.gcc编译器常用选项

 3.1 gcc基本用法

  使用 gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。 GCC 编译器的调用参数大约有100 多个,这里只介绍其中最基本、最常用的参数。
  gcc 最基本用法:gcc [参数] [文件名称]

​ 3.2 常用参数

 -c 只编译:不链接成为可执行文件,编译器只是由输入的.c 等源代码文件生成.o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。

 -o output_filename:确定输出文件的名称为 output_filename,同时这个名称不能和源文件同名。如果不给出这个选项, gcc 就给出预设的可执行文件 a.out。

 -g:产生符号调试工具(GNU 的 gdb)所必要的符号信息,要想对源代码进行调试,我们就必须加入这个选项。

 -O:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、链接的速度就相应地要慢一些。

 -O2:比-O 更好的优化编译、链接,当然整个编译、链接过程会更慢。

 -E:仅执行编译预处理;

 -S:将 C 代码转换为汇编代码;

 3.3 编译时指定库文件和头文件路径

 -L:指定动态库路径(可以指定多个路径)。

         示例: gcc test.c -o app -L/usr/lib -L ./lib

 -I:指定头文件存放的路径(可以指定多个路径)。

       示例: gcc test.c -I ./ -I /include

 -l:指定库名称(可以指定多个路径)。

       示例: gcc test.c -l my_test -l func

4.linux下采用dlopen调用动态库

 4.1 dlopen调用动态库意义

      为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。 linux 提供了加载和处理动态链接库的系统调用,非常方便。

     生成动态库:gcc -fPIC -shared libxxx.so​ -o xxx.c 

 4.2 dlopen系列函数介绍

#include <dlfcn.h>
void *dlopen(const char *filename, int flags);
函数功能:打开动态库
形参:filename --动态库路径+名字 例:./lib/libmyfile.so
   flags --RTLD_LAZY使用时解析(暂缓解析)
   RTLD_NOW --立刻解析
返回值: handle --成功返回库引用信息,失败返回NULL
int dlclose(void *handle);
函数功能:关闭动态库
形参:handle --dlopen函数返回值
void *dlsym(void handle, const charsymbol);
函数功能:符号解析
形参:handle --dlopen函数返回值
   symbol --要解析的符号
返回值:成功返回符号地址,
    失败返回NULL
char *dlerror(void); //打印错误信息

  注意:调用dlopen时需要通过-ldl指定动态库名字

 4.3函数解析示例

#include "./include/my_file.h"
#include <dlfcn.h>
#include <stdio.h>
int main()

int (*p)(const char *);//定义一个函数指针

/*打开动态库*/
void *handle=dlopen("./lib/libmyfile.so",RTLD_LAZY);
if(handle==NULL)

printf("动态库解析失败%s\\n",dlerror());//打印错误信息
return 0;

/*符号解析*/
p=dlsym(handle,"my_cat");
int res=p("main.c");
printf("res=%d\\n",res);

p=dlsym(handle,"my_du");
p("main.c");
//typedef unsigned int u32;
typedef int (*my_cp)(const char *,const char *);//my_cp表示函数指针类型
my_cp test;//定义函数指针变量
test=dlsym(handle,"my_cp");
test("main.c","test.c");

dlclose(handle);//关闭动态库

 4.4变量解析示例

#include "./include/my_file.h"
#include <dlfcn.h>
#include <stdio.h>
int main()

int (*p)(const char *);//定义一个函数指针
/*打开动态库*/
void *handle=dlopen("./lib/libmyfile.so",RTLD_LAZY);
if(handle==NULL)

printf("动态库解析失败%s\\n",dlerror());//打印错误信息
return 0;

/*符号解析*/
p=dlsym(handle,"my_du");
p("main.c");
printf("-----------------------------------\\n");
/*解析变量*/
int *p2;
p2=dlsym(handle,"data");
printf("*p2=%d\\n",*p2);
*p2=300;
p("main.c");
dlclose(handle);//关闭动态库


linux静态库和共享(动态)库的创建与使用详解(代码片段)

文章目录Linux静态库和共享(动态)库库的介绍使用库有什么好处库制作完成后,如何给用户使用静态库(staticlibrary)静态库的制作ar工具创建lib过程静态库的使用源代码静态库的优缺点优点:缺点:共享库... 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

...、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1静态库4.2动态库前言下面的... 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

...、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1静态库4.2动态库前言下面的... 查看详情

详解linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别(代码片段)

文章目录一、库的概念Windows的库Linux的库二、动态库和静态库的区别1.载入顺序不同2.大小与共享的差异3.库函数调用的差异三、静态库的创建和使用1.创建静态库的步骤:(一)ar命令的使用方法(二)生成静... 查看详情

[linux高并发服务器]制作静态库与动态库(代码片段)

[Linux高并发服务器]制作静态库与动态库[Linux高并发服务器]制作静态库与动态库[Linux高并发服务器]制作静态库与动态库什么是库静态库的制作和使用命名规则静态库的制作静态库的使用动态库的制作和使用命名规则动态库的制作... 查看详情

linux_动态库与静态库(制作与安装)

文章目录1.静态库和动态库的定义,库的命名规则2.静态库与动态库的优缺点LinuxCentos下载C静态库命令生成静态链接C程序-static查看可执行程序依赖的动态库(ldd)静态库与动态库的特征①动静态程序运行过程②动静态... 查看详情

linux下c/c++编程开发静态库和动态库(代码片段)

...、静态库2.1命名规则2.2静态库的制作2.3静态库的使用三、动态库3.1命名规则3.2动态库的制作3.3动态库的使用3.3.1修改环境变量3.3.2修改/etc/ld.so.cache文件列表3.3.3/lib或/usr/lib目录四、动静态库的优缺点4.1静态库4.2动态库前言下面的... 查看详情

静态库和动态库同时链接

...序需要链接外部库的情况下,linux默认对库的链接是使用动态库,在找不到动态库的情况下再选择静态库。当动态库与静态库混合链接时,使用-static会导致所有的库都使用静态链接的方式,这时就需要-Wl的方式: gcc–otest... 查看详情

linux静态函数库和动态函数库

Linux系统中存在大量的函数库。简单来讲,函数库就是一些函数的集合,每个函数都具有独立的功能且能被外界调用。我们在编写代码时,有些功能根本不需要自己实现,直接调用函数库中的函数即可。需要注意的是,函数库中... 查看详情

linux静态函数库和动态函数库

Linux系统中存在大量的函数库。简单来讲,函数库就是一些函数的集合,每个函数都具有独立的功能且能被外界调用。我们在编写代码时,有些功能根本不需要自己实现,直接调用函数库中的函数即可。需要注意的是,函数库中... 查看详情

linux下的静态库和动态库

...小的改动,但对于用户来说,会导致整个程序重新下载。动态库在程序编译时不会被连接到目标代码中,在后期运行时才会载入,不同的应用程序如果调用相同的库,内存中只有一份共享库的拷贝,也就避免了空间的浪费问题。... 查看详情

windows和linux下的目标文件静态库和动态库

Windows和Linux下的目标文件、静态库和动态库一、.obj.lib.dll使用在windows平台下:.obj:目标文件,相当于源代码对应的二进制文件,未经重定位。.lib:可理解为多个obj的集合,本质与.obj相同。.dll:动态... 查看详情

linux静态库和动态库编译的区别

Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.solibhello.a为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如:libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以... 查看详情

linux动态库和静态库(代码片段)

...静态库动静态库各自的特征静态库的打包与使用打包使用动态库的打包与使用打包使用动静态库的基本原理动静态库的本质是可执行程序的“半成品”。我们都知道,一堆源文件和头文件最终变成一个可执行程序需要经历以... 查看详情

windows和linux下的目标文件静态库和动态库

Windows和Linux下的目标文件、静态库和动态库一、.obj.lib.dll使用在windows平台下:.obj:目标文件,相当于源代码对应的二进制文件,未经重定位。.lib:可理解为多个obj的集合,本质与.obj相同。.dll:动态... 查看详情

linux环境下的静态链接库和动态链接库(代码片段)

什么是链接库计算机中,有些文件专门用于存储可以重复使用的代码块,例如功能实用的函数或者类,我们通常将它们称为库文件,简称“库”(Library)。以C语言为例,如下为大家展示的就是一个函数库://myMath.cintadd(inta,intb)r... 查看详情

《c语言杂记》静态库和动态库(linux版)(代码片段)

1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通... 查看详情

《c语言杂记》静态库和动态库(linux版)(代码片段)

1静态库和动态库概述库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。库有两种:静态库和动态库。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通... 查看详情