在 Linux 系统中,库是一组预编译的函数和子程序,可供程序员在程序中使用。
库可分为两种类型:共享库(Shared Libraries)和静态库(Static Libraries)。
静态库
静态库是一个包含了多个目标文件(.o 文件)的归档文件,扩展名为 .a。
当程序链接到静态库时,库中所需的目标文件会被完整地复制到目标程序中。
这样,程序在运行时不再需要库文件。
创建静态库的步骤:
a. 编译源代码文件,生成目标文件:
gcc -c source1.c source2.c
b. 使用 ar
命令创建静态库:
ar rcs libexample.a source1.o source2.o
使用静态库: 当链接程序时,只需指定静态库的路径即可。例如:
gcc main.c -L. -lexample -o main
其中,-L.
表示在当前目录中搜索库,-lexample
表示链接名为 libexample.a 的库。
共享库
共享库(又称动态库)是一种在程序运行时才加载的库,扩展名为 .so。
多个程序可以共享同一个共享库,从而减小程序的体积并节省系统资源。
创建共享库的步骤
a. 编译源代码文件,生成目标文件:
gcc -fPIC -c source1.c source2.c
这里的 -fPIC
选项表示生成位置无关代码(Position Independent Code)。
b. 使用 gcc
命令创建共享库:
gcc -shared -o libexample.so source1.o source2.o
使用共享库: 当链接程序时,只需指定共享库的路径即可。例如:
gcc main.c -L. -lexample -o main
其中,-L.
表示在当前目录中搜索库,-lexample
表示链接名为 libexample.so 的库。
为了在运行时找到共享库,你还需要设置环境变量 LD_LIBRARY_PATH
,使其包含共享库所在的目录。例如:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/shared/library
或者,将共享库安装到系统默认的库目录(如 /usr/local/lib
)中,并运行 ldconfig
命令更新系统库缓存。
总结
静态库和共享库在 Linux 系统中都有其用途,静态库可以使程序独立于外部库文件,但可能导致程序体积较大。
共享库在多个程序中共享,可以节省系统资源,但需要在运行时加载。