知识点:
1.删除静态库后还是可以运行的,删除共享库后不可以运行
静态库删除后可以运行,代码如下:
动态库删除后不能运行,代码如下:
2.#include <stdio.h> 用“<>”引用的头文件 都在/uesr/include 里面,数学库math.h也得指定路径(如下图)
3.main.c->main.o 通过预编译编译链接生成
main.o->main(或者叫main.exe) 通过链接生成
4.静态库编译出来的程序要大一点(因为会包含静态库的里面的函数)
共享库编译出来的程序要小一点(不会包含共享库里面的函数)
编译包含了:预编译 编译 汇编
5.Windows里共享库也叫动态链接库
6.运行程序时加载库
7.共享库程序升级的话很方便(如函数进行了更新,不需要重新编译,运行的时候就会链接信的函数)
静态库程序升级较不方便(如函数进行了更新,编译的时候需要把之前的文件删除,然后重新编译,再运行)
8.int main(int argc,char argv[],char envp[])//argc参数个数 argv参数内容 envp环境变量
9.库文件:预先编译好的方法的集合
10.(面试重点)静态库和共享库的区别:1.共享库编译出来的可执行程序不会包含共享库用到的代码,只有运行程序的时候才会去链接,而静态库编译出来的可执行程序包含了静态库用到的代码2.如果共享库被删除了,那么程序不能运行,但是静态库可以3.更新静态库后,代码需要重新编译,而共享库不用,因为共享库总是去链接
11.库文件在/lib或者/usr/lib
头文件在/usr/include
12.(面试常问)ldd可以查看可执行程序用到了哪些共享库
1.什么是库文件?
库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 或 /usr/lib。在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在/usr/include下或其子目录下。库有两种,一种是静态库,其命令规则为 libxxx.a,一种是共享库,其命令规则为 libxxx.so,如下图所示:
2.静态库的生成和使用:
以下是需要生成静态库的“.c”文件,其中“foo.h”中是函数的声明,“add.c”和“max.c”是函数的定义:
第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件
第二步:使用 ar 命令将第一步编译的所有”.o”文件生成静态库,其中:c 是创建库,r 是将方法添加到库中,v 显示过程
以下是使用静态库“libfoo.a”和“main.c”生成可执行文件的过程,其中:-L 指定库的存储路径,-l 指定库的名称(不需要前面的‘lib’和扩展名‘.a’)
虚拟机代码:
3.共享库的生成与使用
以下是需要生成共享库的”.c”文件,其中“foo.h”中是函数的声明,“add.c”和“max.c”是函数的定义:
第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件
第二步:使用 gcc 命令将第一步编译的所有”.o”文件生成共享库
以下是使用共享库“libfoo.so”和“main.c”生成可执行文件的过程,其中 -L 指定库的存储路径, -l 指定库的名称(不需要前面的‘lib’和扩展名‘.so’), 如果在库的存储路径有同名的共享库和静态库,gcc 默认使用共享库。
生成之后,直接执行 main 程序,发现出错,原因是系统加载共享库时,找不到对应的共享库文件”libfoo.so”, 但是该库确实在当前目录下存在。这是为什么呢?因为系统默认只会去存储库的标准位置(/lib 或/usr/lib 等)加载,而不会在当前位置寻找。所以将库拷贝到/usr/lib 下,再执行程序,就可以成功。如果库不在标准位置下,也可以通过设置环境变量”LD_LIBRARY_PATH”来指定加载库的路径。
可以通过 ldd 命令查看可执行程序使用了哪些共享库:
虚拟机代码:
在这里插入图片描述