【Linux 相关】 静态库与动态库的编译和使用

参考博客 http://www.cnblogs.com/feisky/archive/2010/03/09/1681996.html

上述博客中关于静态库与动态库的讲解,很清晰!

库的定义:

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

静态库和动态库的区别

1. 静态函数库

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

2. 动态函数库

这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。 
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

示例:

静态库的编译与使用:

 1 //***static_lib1.c***
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5
 6 int printSelf1()
 7 {
 8     printf("I am static lib 1\n");
 9     return 0;
10 }
 1 //***static_lib2.c***
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5
 6 int printSelf2()
 7 {
 8     printf("I am static lib 2\n");
 9     return 0;
10 }
 1 //***main.c***
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5
 6 int main()
 7 {
 8     printSelf1();
 9     printSelf2();
10     return 0;
11 }
#***makefile***
main:main.c static_lib
    gcc main.c -L. -lstatic_lib -o main
#***just compile c file
static_lib1:static_lib1.c
    gcc -c static_lib1.c
#***just compile c file
static_lib2:static_lib2.c
    gcc -c static_lib2.c
#***create statlic lib***
static_lib:static_lib1.o static_lib2.o
    ar -rsv libstatic_lib.a static_lib1.o static_lib2.o
    rm -rf static_lib1.o static_lib2.o
clean:
    rm -rf main
    rm -rf libstatic_lib.a

执行步骤:

[[email protected] static_lib]$ make
cc    -c -o static_lib1.o static_lib1.c
cc    -c -o static_lib2.o static_lib2.c
ar -rsv libstatic_lib.a static_lib1.o static_lib2.o
r - static_lib1.o
r - static_lib2.o
rm -rf static_lib1.o static_lib2.o
gcc main.c -L. -lstatic_lib -o main
[[email protected] static_lib]$ ar -t libstatic_lib.a 
static_lib1.o
static_lib2.o
[[email protected] static_lib]$ ./main
I am static lib 1
I am static lib 2

注: ar 命令与静态库相关,用于出库已经查询库信息

动态库的编译与使用:

 1 //***dynamic.c***
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5
 6 int printSelf()
 7 {
 8     printf("this is a dynamic lib src\n");
 9     return 0;
10 }
 1 //***main.c***
 2 #include <unistd.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5
 6 int main()
 7 {
 8     printSelf();
 9     return 0;
10 }
#***makefile***
main:main.c dynamic_lib
    gcc main.c -L. -ldynamic_lib -o main
#***create dynamic lib libdynamic_lib.so
dynamic_lib:dynamic.c
    gcc -fPIC -shared dynamic.c -o libdynamic_lib.so
clean:
    rm -rf main

编译成功后执行步骤如下:

[[email protected] dynamic_lib]$ ./main
./main: error while loading shared libraries: libdynamic_lib.so: cannot open shared object file: No such file or directory
[[email protected] dynamic_lib]$ export LD_LIBRARY_PATH=.
[[email protected] dynamic_lib]$ csh
[[email protected] dynamic_lib]$ setenv LD_LIBRARY_PATH .
[[email protected] dynamic_lib]$ ldd -r main
	linux-gate.so.1 =>  (0x00b9b000)
	libdynamic_lib.so => ./libdynamic_lib.so (0x0084a000)
	libc.so.6 => /lib/libc.so.6 (0x008dd000)
	/lib/ld-linux.so.2 (0x008bf000)
[[email protected] dynamic_lib]$ ./main
this is a dynamic lib src

注:直接执行会报错,因为没有定义LD_LIBRARY_PATH环境变量时,动态库的查找路径只是/usr/lib, /lib; 只有设置了环境变量才可以找到动态库;

使用ldd -r main 就是检查库的依赖关系

其中csh命令是切换用户的shell为cshell, 用户登录默认shell为bash,这里做切换只是为了演示在csh,bash下分别如何设置环境变量。

对于在代码中动态调用动态库的方式这里就不记录了,可以参考文章开头中的博客,觉得写得挺好

时间: 2024-08-06 16:05:03

【Linux 相关】 静态库与动态库的编译和使用的相关文章

Linux使用静态库和动态库

Linux使用静态库和动态库 (一)库的概念 库是可以复用的代码,在一些大的项目中常常会用到库. 本质上说:库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 一般说库是说两种: 静态库:linux下.a文件.windows下.lib文件 动态库:linux下.so文件.windows下.dll文件 最近花了一些时间把linux下编译.链接等研究了一下,作为一个菜鸟记录并分享一蛤. (二)静态库与动态库 程序的编译运行要经过以下步骤: 1.源文件(.h .cpp等) 2.预编译 3.编

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

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

Linux 如何生成静态库和动态库

1.引言 1.linux下的库 静态库和共享库(动态库),二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小. 2.库存在的意义 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议. 现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 共享库的好处是,不同的应用程序如果调用相同的库,那么

linux成长之路(gcc编译器、静态库、动态库)

Jeremy Lin GCC简介 GCC(GNU Complier Collection)是GNU推出的功能强大.性能优越的多平台编译器套件,它包括了C.C++.Objective-C.Fortran.Java.Ada和Go语言的前端,也包括了这些语言的库,当前最新的版本是GCC 5.1.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%-30%.GCC编译器能将C.C++语言源程序.汇程式程序和目标程序编译.连接成可执行文件,如果没有给出可执行文件的名字

[转]Linux下用gcc/g++生成静态库和动态库(Z)

Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅 在 linux 下,库文件一般放在 /usr/lib 和 /lib 下, 静态库的名字一般为 libxxxx.a ,其中 xxxx 是该 lib 的名称 动态库的名字一般为 libxxxx.so.major.minor , xxxx 是该 lib 的名称, major 是主版本号, minor 是副版本号

Linux下静态库与动态库

一.基本概念 1.1.什么是库        在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由于 windows 和 linux 的平台不同(主要是编译器.汇编器和连接器 的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍 linux 下的库. 1.2. 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同: 静态库的代码在编译过程中已经被

linux下静态库和动态库一些东西

http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux  动态链接库和静态库示例 文件预览 文件目录树如下,如你所见,非常简单. libtest/ |-- lt.c |-- lt.h `-- test.c 代码 #lt.c /* lt.c * */ #include <stdio.h> void myprint(void) { printf("Linux library test!\n&quo

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

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

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消