`

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环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...

    linux 动态库静态库

    这些资料将帮助你深入理解和掌握Linux环境下的动态库和静态库的运用。 总之,Linux的动态库和静态库是程序开发的重要组成部分,它们提供了代码复用的方法。了解并熟练掌握它们的创建和使用,将对提升开发效率和优化...

    Linux静态库和动态库

    ### Linux静态库与动态库详解 #### 基本概念 **库的定义与作用**:库,实质上是预编译的代码集合,旨在提供重复使用的功能或服务,简化软件开发过程。无论是在Windows还是Linux平台,库的存在极大地提高了编程效率...

    linux静态库与动态库

    在Linux操作系统中,库文件是...总之,理解Linux下的静态库和动态库以及如何生成和使用它们对于进行系统级编程和软件开发至关重要。选择静态库或动态库取决于需求,如资源限制、程序部署的便捷性以及库更新的需求等。

    Linux下Gcc生成和使用静态库和动态库详解

    ### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...

    静态库和动态库_共享库

    库还可以以共享库(Shared Library)和动态库(Dynamic Library)的形式存在,两者在Linux和其他类UNIX系统中通常是同义词,都指的是在程序运行时加载的库。与Windows下的.dll文件类似,这些库在编译时仅作为引用,...

    Linux 如何使用gcc生成静态库和动态库

    Linux 使用 GCC 生成静态库和动态库 在 Linux 系统中,使用 GCC 编译器可以生成静态库和动态库。静态库和动态库是两种不同的库类型,它们的主要区别在于代码被载入的时间不同。 静态库是在编译时被载入到可执行...

    Linux编译动态库和静态库

    在Linux系统中,开发软件时常会遇到需要创建和使用动态库(.so)与静态库(.a)的情况。动态库允许多个程序共享同一份代码,节省内存资源,而静态库则将库代码直接编译进目标程序,不依赖外部环境。本篇将详细介绍在...

    linux静态库及动态库创建及使用

    ### Linux静态库及动态库创建及使用 #### 一、基本概念 ##### 1.1 什么是库 在计算机编程领域,**库**(Library)是一系列预编译的代码集合,这些代码通常实现了某些功能或服务,可供其他程序在运行时调用。库可以...

    cximage静态库 动态库 64位linux版本

    本篇文章将深入探讨cximage库的静态库和动态库版本,以及如何在64位Linux系统中编译和使用它们。 首先,让我们理解什么是cximage库。cximage是一个强大的C++类库,用于处理图像文件,支持多种格式如BMP, JPEG, PNG,...

    在Linux中创建静态库和动态库

    通过上述步骤,我们不仅了解了如何在Linux环境中创建和使用静态库与动态库,还学习了它们之间的主要区别: - **静态库**:在编译时会被链接到最终的可执行文件中,因此一旦程序被编译完成,就不需要依赖外部的库...

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

    Linux 下编译静态库和动态库 Linux 下编译静态库和动态库是 Linux 开发中非常重要的一部分。静态库和动态库都是库文件,但是它们的使用方式和特点不同。下面我们将详细介绍 Linux 下编译静态库和动态库的过程。 一...

    linux静态库和共享库.pdf

    在Linux操作系统中,库扮演着至关重要的角色,它们是预先编译的代码集合,允许开发者重用和集成已经实现的功能,而无需从零开始编写代码。...理解和掌握静态库与共享库的使用和管理对于任何Linux开发者都是至关重要的。

    Linux静态库和动态库的制作和使用(ubuntu18.04)以及解决动态库加载失败问题

    总的来说,理解和熟练掌握Linux下的静态库和动态库的制作与使用对于开发和调试程序至关重要。同时,了解如何解决动态库加载失败的问题能帮助我们快速定位和解决问题,提高开发效率。通过实践和学习,你可以更加深入...

    linux下静态库及动态库的创建与使用.pdf

    通过这个实验,我们可以更好地理解静态库和动态库在Linux环境下的创建、使用和管理方式,以及它们在软件开发中的作用和优势。库的存在极大地提高了代码的复用性和效率,减少了重复工作,是现代软件开发不可或缺的一...

    Linux下动态和静态链接库的使用

    与静态库不同,动态库在程序运行时才加载,可以减少程序的内存占用,并允许多个程序共享同一份库,但需要确保库文件在运行时可找到。创建动态库的步骤如下: - 使用`gcc`的`-shared`选项创建动态库,例如`gcc -...

    [转]在Linux中创建静态库.a和动态库.so

    在Linux系统中,开发软件时经常需要使用到库文件,它们分为静态库(.a)和动态库(.so)。本文将详细介绍如何在Linux环境中创建这两种类型的库,并探讨它们的区别和使用场景。 首先,让我们理解静态库和动态库的...

Global site tag (gtag.js) - Google Analytics