linux 的动态库和静态库

库从本质上来说,是一种可执行代码的二进制格式,可以载入内存中执行。库分静态库和动态库两种

静态库:这类库的名字一般是libxxx.a, xxx是库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合到目标代码中。优点是,变异后的执行程序不需要外部的函数库支持。确定是,如果静态函数库改变了,那么程序需要重新编译。

动态库:这类库的名字一般是libxxx.M.N.so,xxx是库的名字,M是库的主版本号,N是库的副版本号。(版本号不是必须的)。动态库是在程序运行时动态申请并加载的,需要程序的运行环境中必须提供相应的库。

要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

静态库的制作

准备两个库的源码文件 souce_one.c和souce_two.c

$ cat souce_one.c
#include <stdio.h>

void print1(){
    printf("souce_one\n");
}

$ cat souce_two.c
#include <stdio.h>

void print2(){
    printf("souce_two\n");
}

编译成静态库:

$ gcc -c souce*.c
$ ar -rsv libmytest.a souce*.o

准备测试程序测试生成的静态库:

$ cat test.c
int main(){
    print1();
    print2();
    return 0;
}

编译链接测试程序:

gcc test.c
$ gcc test.c -L./ -lmytest
$ ./a.out
souce_one
souce_two

## -L指定库文件的路径
## -l使用的库的名字

动态库的制作

这里还是使用上面的3个文件souce_one.c、souce_two.c 、test.c

编译动态库

$ gcc -c souce_*.c
$ gcc -shared -fPCI -o libtest.so souce_*.o

## -shared :指定生成动态链接库
## -fPIC:表示编译为位置独立的代码

测试动态库

$ gcc test.c  -ltest
## -l 指定连接阶段引用共享库
$  ./a.out  #执行程序时会报错
./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
$  ldd ./a.out ##  使用ldd查看依赖,发现libtest库没有找到
    linux-gate.so.1 =>  (0xb7783000)
    libtest.so => not found
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75cb000)
    /lib/ld-linux.so.2 (0xb7784000)

$ cp libtest.so /usr/lib/  #将动态库拷贝到程序默认查找的目录
$ ./a.out
souce_one
souce_two

时间: 2024-07-29 10:55:18

linux 的动态库和静态库的相关文章

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制

linux动态库与静态库使用比较

在windows下,动态库dll的使用往往伴随着lib的指引,而linux使用动态库和静态库则有较大的不同. linux静态库和动态库的区别 1. 静态库 名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,编译后的执行程序不需要外部的函数库支持,但是,升级比较麻烦.每一次版本更新都需要重新编译. 2. 动态库 名字一般是libxxx.so;动态库没有被编译进最终程序,只有在需要的时候,动态加载到内存中.编译后的程序不包含动态库部分,程

Linux系统中“动态库”和“静态库”那点事儿

摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接

技巧:Linux 动态库与静态库制作及使用详解

技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法:3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题.本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介

Linux环境编译动态库和静态库总结

对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文件 libname.a 为静态库, name 为静态库的名字, 可以根据模块功能命名. 举个例子 在当前目录下,有一个mymethod.h文件 在mymethod.cpp里实现这两个函数 在当前目录下有一个main.cpp文件 为了方便使用,将mymethod.cpp封装成静态库和动态库 首先将my

Linux下的动态库与静态库

2019-09-25 关键字:生成库.静态库引用.动态库引用 在 C 开发中,“库”是一个经常听到的名词. 所谓的库其实就是一个二进制文件.这个二进制文件的内容是可被其它C程序调用执行的函数.换句话说,库就是一组C代码的打包形式而已,打包是指将源代码以库的形式编译而生成的文件. 不过即使它只是源代码的打包,它也仍然是有系统专有性的,即不同系统下编译出来的库并不能互相兼容使用. C库可分为动态库与静态库两种.引用了外部库的应用程序在编译时会在”链接期“处理库与程序源码之间的关系. 1.静态库 静态

如何使用Eclipse的NDK开发动态库,静态库

============问题描述============ 如何使用Eclipse的NDK开发动态库,静态库? Eclipse中已经安装了NDK,CDT和Esequoyah并配置(是在网上查的). 我是做C++的,公司业务需要自学Android,对Java也是知道一点皮毛. 在网上查了一些资料,我都没有成功做出最简单的动态库或静态库,郁闷啊! 有没有详细指导? ============解决方案1============ 你去搜一下Android的jni开发,就知道了,一点都不难,不过一般开发ndk

函数库:静态库和动态库

1.函数库 函数库其实就是一些写好的函数集合,方便别人的复用.实现的封装之后,最终的目的都是给别人调用. 2.库的形式 库的形式分:动态链接库和静态链接库. 优点: (1)库文件都是被编译好的二进制文件,别人看不到源代码,可以保持保密:(2)同时不会因为不小心被修改出现问题,便于维护. LINUX 下的库学习: 静态链接库:.a 文件 其实就是将多函数,做编译但是不链接生成的 .o 文件,使用 ar 工具打包为 .a 的文件.编译的阶段,当调用这些库的时候,链接器就会去 .a 的库文件中拿出被调