东简介
库是一组预先编译的函数集合。标准系统文件存在/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查看一个程序需要的共享库