Linux下静态库和动态库的制作与使用

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: "Times New Roman", serif }
h2 { margin-top: 14.0pt; margin-right: 0cm; margin-bottom: 14.0pt; margin-left: 28.8pt; text-indent: -28.8pt; font-size: 18.0pt; font-family: 宋体 }
p.MsoHeader,li.MsoHeader,div.MsoHeader { margin: 0cm; margin-bottom: .0001pt; text-align: center; border: none; padding: 0cm; font-size: 9.0pt; font-family: "Times New Roman", serif }
p.MsoBodyText,li.MsoBodyText,div.MsoBodyText { margin-top: 0cm; margin-right: 0cm; margin-bottom: 6.0pt; margin-left: 0cm; text-align: justify; font-size: 10.5pt; font-family: "Times New Roman", serif }
p.MsoPlainText,li.MsoPlainText,div.MsoPlainText { margin-top: 14.0pt; margin-right: 0cm; margin-bottom: 14.0pt; margin-left: 0cm; font-size: 12.0pt; font-family: 宋体 }
span.2Char
{ font-family: 宋体; font-weight: bold }
span.Char { font-family: 宋体 }
span.Char0 { font-family: 宋体 }
span.Char1 { font-family: 宋体 }
.MsoChpDefault { font-size: 10.0pt }
div.WordSection1 { }
ol { margin-bottom: 0cm }
ul { margin-bottom: 0cm }

Linux下静态库和动态库的制作与使用
    Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
 
静态函数库:
  这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。
 
动态函数库:
  这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减小应用程序的体积。
 
下面来介绍linux静态函数库的创建和使用:
 
  例程add.h add.c sub.h  sub.c main.c:
  add.h

  add.c

main.c

  不管是静态函数库还是动态函数库,都是由*.o目标文件生成。
 
所以先 gcc -c add.c gcc -c sub.c
生成add.osub.o
 
  静态函数库由ar命令创建
  本例:ar -cr libaddsub.a add.o sub.o
 
  -c create的意思
  -r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
  到此静态函数库创建完毕。
 
  使用方法:通过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,因为在动态函数库使用时,会查找/usr/lib /lib目录下的动态函数库,而此时我们生成的库不在里边。
  这个时候有好几种方法可以让他成功运行:
 
  最直接最简单的方法就是把libaddsub.so拉到/usr/lib 或/lib中去。
       还有一种方法,假设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下动态库的层次结构及静态链接与动态链接的区别如下图:
1. Linux 中的库层次结构
 
2.
静态链接与动态链接
 
下面以一个简单的动态库为例讲解动态链接与动态加载方法:
动态库示例:
add.c
int add(int a,int b){
  
     return (a+b);
}
编译动态库:gcc -shared
-o libadd.so add.c 生成 libadd.so
动态链接方法:在编译程序时,指定要链接的库文件即可,此时调用共享库只需要其头文件即可。
示例:
test.c
#include <stdio.h>
#include <dlfcn.h>
int add(int,int);
int main(int argc, char *argv[])
{
        sum=add(10,11);
        printf("sum=%d",sum);
}
编译程序:gcc -l add -o test test.c
-l 参数表示要链接的动态链接库,若路径不在标准库文件路径下可用-L 包含。
 
动态加载方法:通过下列API完成
1. Dl API

函数


描述


dlopen


使对象文件可被程序访问


dlsym


获取执行了 dlopen 函数的对象文件中的符号的地址


dlerror


返回上一次出现错误的字符串错误


dlclose


关闭目标文件

编译程序:gcc -o test
test.c -ldl
-ldl 表明将 dllib 链接于该程序,即可调用DL的API
共享库的路径:可以放在系统共享库目录:/usr/lib下,也可以通过环境变量LD_LIBRARY_PATH设置

时间: 2024-12-24 17:09:08

Linux下静态库和动态库的制作与使用的相关文章

Linux下gcc编译控制动态库导出函数小结

Linux下gcc编译控制动态库导出函数小结 来源 https://www.cnblogs.com/lidabo/p/5703890.html 根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility("hidden"))) 就是说将不公开的函数都加上这个属性,没加的就是可见的 2. gcc 在链接时设置 -fvisibility=hidden,则不加 v

indy openssl lazarus 编程linux下出现不能装载动态库的问题原因!

版本不对的原因. 具体在10.5.9下修改此参数即可解决问题. LoadFunction() has an ACritical parameter. It is set to True by default, but can be set to False for individual functions (and currently is False for TLS 1.1+ and DTLS functions). You can patch IdSSLOpenSSLHeaders.pas

linux下,一些关于动态库的问题:

程序运行是加载动态库的几种方法: 第一种,通过ldconfig命令    ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令它,ldconfig命令通常在系统启动时运行,而当一个用户安装我新的动态库时,就需要手工运行这个命令.ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(

linux下C语言编程动态库so的编写及调用

//test_so.h #include <stdio.h> void test_a(); void test_b(); //test_a.c #include "so_test.h" void test_a() { printf("this is in test_a...\n"); } //test_b.c #include "so_test.h" void test_b() { printf("this is in te

静态库和动态库的区别和win平台和linux平台代码实现

什么是库 库是写好的,现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..dll). 所谓静态.动态是指链接.回顾一下,将一个程序编译成可执行程序的步骤: 图1.编译过程 静态库 之所以称为[静态库],是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的

C++静态库与动态库(比较透彻)

这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养——链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..

C++静态库与动态库(转)

http://www.cnblogs.com/skynet/p/3372855.html 静态库 之所以成为[静态库],是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中. 创建静态库过程 Linux下创建与使用静态库 Linux静态库命名规则 Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a. 创建静态库(.a) 通过上面的流程可以知道,Linux创建静态库过程如下: 1.

C++静态库与动态库详解

1 库的概念? 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库. 2 动态库与静态库的概念? 先回顾一下编译过程: 2.1 静态库 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,对应的链接方式称为静态链接.试想一下,静态库与汇编生成的目标文件(.o文件)一起链接为可执行文件,那么静态库必定跟.o文件格式相似.其实一个静态库可以 简单看成是一组目标文件(.o/.obj文件)的归档集合,即很多目标文件经过压缩打包后形成的一个文件

(转)C++静态库与动态库

转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养——链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上

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

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同