【Linux】静态库和动态库的生成与使用

库文件,是一堆二进制代码实现的集合文件。我们要生成一个库,就是将一大堆代码实现打包生成一个库文件,其中不能包括main函数
生成可执行程序链接动态库时,是将动态库中的函数信息表记录到可执行程序中,生成的可执行程序较小,运行时要加载动态库,不会造成代码冗余,在gcc编译器中就默认使用动态链接。
生成可执行程序链接静态库时,是将静态库中使用到的代码全部写入可执行程序中,生成的可执行程序较大,运行时不需要库文件,但却会造成代码冗余。

  • 生成动态库
    命名方式:以lib作为前缀,以.so作为后缀,中间为名称
gcc -fPIC -c child.c -o child.o //将源码编译为二进制代码
gcc -shared child.o -o libchild.so

-fPIC产生位置无关代码;
-shared告诉编译器生成的是库文件而不是可执行文件;

  • 生成静态库
    命名方式:以lib作为前缀,以.a作为后缀,中间为名称
gcc -c child.c -o child_static.o //将源码编译为二进制代码
ar -cr libchild.a child.o //使用ar工具打包静态库

动态库和静态库的使用分为:生成可执行程序时链接使用、运行可执行程序时加载使用(仅针对动态库)

  • 生成可执行程序时链接使用
    使用gcc编译器,在生成可执行程序时,使用-l选项指定要链接的库文件名称。
    gcc编译器会默认去以下路径寻找库文件:
    1 .将库文件放在默认指定的路径下 /lib64
    2 .环境变量LIBRARY_PATH保存默认查找路径,将库文件所在路径添加到环境变量中:
    export LIBRARY_PATH=${LIBRARY_PATH}:.
    3 .使用gcc编译选项-L指定库文件所在路径:
    gcc main.c -o main -l child -L./

  • 运行可执行程序时加载使用(仅针对动态库)
    gcc编译器会默认去以下路径寻找库文件:
    1 .将库文件放在默认指定的路径下 /lib64
    2 .环境变量LD_LIBRARY_PATH保存默认查找路径,将库文件所在路径添加到环境变量中。

你可能感兴趣的:(linux)