`

Linux下静态库和动态库(共享库)的制作与使用

 
阅读更多

下面是总结的一个经典帖子的内容,不是我原创,在此声明:

Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

静态函数库:
      这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。


动态函数库:
      这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减小应用程序的体积。


下面来介绍linux静态函数库的创建和使用:例程add.h add.c sub.h    sub.c    main.c:

add.h

#ifndef ADD_H
#define ADD_H
int add(int x,int y);
#endif

add.c

#include <stdio.h>
#include "add.h"

int add(int x,int y){
      return (x+y);
}

--------------------------------------------------------------------
sub.h

#ifndef SUB_H
#define SUB_H
int sub(int x,int y);
#endif


sub.c

#include <stdio.h>
#include "sub.h"

int sub(int x,int y){
      return (x-y);
}
-----------------------------------------------------------------------

main.c

#include <stdio.h>
#include "sub.h"
#include "add.h"

int main(){
      int a,b;
      a = add(1,2);
      b = sub(10,5);  

      printf(“a=%d,b=%d\n”,a,b);
          return 0;
      }
-----------------------------------------------------------------------
不管是静态函数库还是动态函数库,都是由*.o目标文件生成。
所以先 gcc -c add.c
       gcc -c sub.c
生成add.o     sub.o
-----------------------------------------------------------------------
静态函数库由ar命令创建

本例:ar -cr libaddsub.a add.o sub.o
       -c create的意思
       -r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
       到此静态函数库创建完毕。

生成的静态函数库有两类东西是必须的:静态库libaddsub.a 和 头文件add.h, sub.h

使用方法:通过gcc -o main main.c -L. -laddsub编译main.c就会把静态函数库整合进main。
       其中
       -L指定静态函数库的位置供查找,注意L后面还有'.',表示静态函数库在本目录下查找。
       -l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略。
       根据静态函数库的特性,此处删除libaddsub.a后main依然可以运行,因为静态库的内容已经整合进去了。

-----------------------------------------------------------------------
动态函数库的创建和使用

gcc -shared -fpic -o libaddsub.so     add.c sub.c
-fpic:产生位置无关代码
-shared:生成共享库

用上述命令生成libaddsub.so 动态函数库。
gcc -o out main.c -L. -laddsub   ==>回忆《程序员自我修养》一书,这里好像是在out中插入了一个stub,在运行时候去调用共享库

此时还不能立即./out,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库不在里边。
这个时候有好几种方法可以让他成功运行:
    (1)最直接最简单的方法就是把libaddsub.so拉到/usr/lib 或/lib中去。
    (2)还有一种方法,假设libaddsub.so在/home/linux/addsub
    export LD_LIBRARY_PATH=/home/linux/addsub:$LD_LIBRARY_PATH

另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。

分享到:
评论

相关推荐

    Linux静态库和动态库的分析及实现

     linux下的库有两种:静态库和共享库(动态库)。  二者的不同点在于代码被载入的时刻不同。  静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。  共享库的代码是在可执行程序运行时才载入内存...

    Linux下编译静态库和动态库1

    1.创建共享库 2.编译共享库 1.环境变量

    Linux C语言动态库及静态库的制作步骤讲解

     动态库的制作:  方法一:    gcc -c -fPIC add.c sub.c div.c mul.c //-c表示生成.o目标文件,-f后加一些编译选项,PIC表示与位置无关  gcc -shared -o libmymath.so add.o sub.o mul.o div....

    Linux操作系统下动态库的生成及链接方法

    Linux下动态库文件的扩展名为\".so\"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号)。这样,线程函数库被称作libthread.so。静态库的文件名形式是libname.a。共享...

    【Linux】静态库和动态库

    Linux下,库分为静态库和共享库。   库的生成 静态库:库名:Libxxx.a,lib是库的前缀,xxx是库名,.a为静态库的后缀。 第一步:将需要生成静态库的.c文件转换为编译后的.o文件 命令:gcc -S mian.o mian.c 第二步...

    linux C库文件的建立和使用资料

    linux下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。 共享库的代码是在可执行程序运行时才载入内存的,在编译...

    Linux下动态连接.doc

    -&gt; 在运行时与共享库(lib*.so)动态链接,通过动态链接装入器,将动态库映射进应用程序 的可执行内存中。在启动应用程序之前,动态链接器将所需的共享库映射到应用的内存, 或者使用系统共享的目标并为应用程序解析所...

    浅谈Linux C语言动态库及静态库

    动态库的制作: 方法一: gcc -c -fPIC add.c sub.c div.c mul.c //-c表示生成.o目标文件,-f后加一些编译选项,PIC表示与位置无关 gcc -shared -o libmymath.so add.o sub.o mul.o div.o//创建共享库mymath,添加...

    linux实验报告

    1)掌握gcc 的用法; (2)了解目标代码、库函数的使用; (3)掌握静态库和共享库的构造与使用; (4)掌握多模块和多语言联合开发方法; (5)掌握make 命令和Makefile 文件的使用

    LINUX安装与配置简明手册

    本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作...

    为Linux应用程序编写DLL程序函数

    Linux 中的应用程序以以下两种方式之一链接到外部函数:要么在构建时与静态库( lib*.a)静态地链接,并且将库代码包含在该应用程序的可执行文件里;要么在运行时与共享库( lib*.so)动态地链接。通过动态链接装入...

    Linux的常用命令cat、sed、zip等用法,以及shell编程的基本语法,以及makefile编写方式等等

    3.lvim工作方式、gcc、gdb用法、动态库和静态库的制作与使用、makefile的编写语法,以及makefile里面的模式匹配、函数、伪目标等知识,以及文件描述符、文件操作(open、close、lseek、stat、dup等语法) 3.进程:进程...

    Mylive555-latest_2020_04_20.tar.gz live555-latest.tar.gz linux 动态库 包管理

    [root@localhost live]# ./genMakefiles linux-64bit /*这个安装时需要选择平台,所以不能直接./configure, 此配置生成的是播放器以及静态链接库,当前不需要*/ [root@localhost live]# ./genMakefiles linux-with-...

    linux网络编程-宋敬彬-part3

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    linux网络编程-宋敬彬-part2

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    linux compline.pdf

    本文档讲解了 linux 编译的问题,如何编写 makefile, 链接库(静态库和动态库),打包等。 如: linux 下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于 windows 中的.obj 文件 .so 为...

    linux安装与配置简明手册

    本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作...

    Program Library HOWTO

    讨论了linux上如何创建使用程序库,包括静态库,共享库,动态库。

    linux网络编程-宋敬彬-part1

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

Global site tag (gtag.js) - Google Analytics