linux静态库和共享库

东简介

库是一组预先编译的函数集合。标准系统文件存在/lib和/usr/lib中。链接程序需要知道搜索那些库文件来生成可执行文件。库有两种:静态库(后缀名为a的文件)和共享库(后缀名为so的文件)

库的使用:

在gcc的编译时可以通过文件的库文件路径名或者-L -l来告诉编译器要搜索的库文件(—L指定在哪个文件夹中搜索库文件,-l告诉库文件名字)
gcc -o test test.c  /opt/libdemo.a
gcc -o test test  -L/opt -ldemo

静态库

函数库最简单的一种形式就是目标文件,当程序需要该函数时,它包含一个声明该函数的头文件,编译器和链接器负责将程序代码和函数库结合在一起使用。 编译器编译时使用头文件,链接器链接时时有目标文件。
例子:

file1: hello .c  库函数源文件
# include <stdio.h >
void say()
{
    printf( "gaoxing");
}

gcc -c hello.c 生成目标文件hello.o

file2: demo.h  库函数头文件 
void say()


file3: main.c  使用库函数 
# include <stdio.h >
# include "demo.h"
int main()
{
    say();
}

gcc -c main.c
gcc -o main main.o  hello.o 
或者 
gcc -o main main.c  hello.o

这就是静态的使用。有人说这不是静态库,这是目标文件。静态库就是目标文件的归档文件。
ar  crv  libhello.a hell.o
为函数库生成一个内容表:
ranlib libhello.a
现在编译命令如下:
gcc -o main main.c -L. -lhello

共享库

静态库的缺点是,当你运行多个应用程序它们使用同一个函数库的函数时,内存中会有同一个函数的多份副本。
共享库的链接方式是这样的:程序本身不包含函数代码,而是引用运行时可访问的共享代码。当编译好的文件加载内存中,函数引用解析并产生共享库的调用,这样多个程序使用同一个库的副本。另一个好处是共享库的更新独立于依赖它的应用程序.

在linux操作系统中,负责装载共享库并解析客户函数引用的程序是ld.so.用于搜索共享库的额外位置可以在文件/etc/ld.so.conf中配置。如果修改了这个文件需要执行ldconfig来处理(如果在/usr/lib或者/lib中添加共享库也需要执行这个命令,编译boost是有需要执行这个命令)

可以通过ldd查看一个程序需要的共享库


来自为知笔记(Wiz)


你可能感兴趣的:(linux静态库和共享库)