一、静态库:在编译链接时,将库内容直接合并到最终的可执行文件中;是中间文件的集合;静态库是在程序当中的;静态库最终执行时不依赖与库文件(即就是在加载的时候已经将静态库拷贝到程序中,就算删除静态库后也对程序的执行没有影响)。
二、动态库: 在链接阶段仅仅是将使用哪个共享库设置到最终的可执行文件,在程序运行时,才会加载动态库;是不可执行(不可单独执行)的可执行文件;动态库是不在程序当中的,执行时会将动态库单独加载到内存中;
三、各自的优缺点:
对于静态库,编译完成之后,库文件的作用就不大了,也就是生成的目标程序没有了外部依赖,可以直接运行;但相应的会使得目标程序的体积增大;对于动态库,不需要将其拷贝到目标程序中,这就不会影响目标程序的体积,并且同一份动态库可以被多个车鞥徐同时使用。由于动态库是编译时才加载到内存中,我们就可以随时对库进行替换,而不需要重新编译代码。当然,动态库的动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少或者库的版本不正确,就会产生程序崩溃的问题。
四、库文件:某些功能代码的集合;不允许有main函数
Windows上静态库是.lib,动态库是.dll;
Linux上静态库是.a,动态库是.so.
1.1生成静态库:将所有的.c文件生成.o文件,除main函数
1)gcc -c *.c -à *.o文件
2)ar crv libxxx.a *.o--àlibxxx.a 将目标文件归档
1.2使用静态库:main.c
方式一:Gcc -o main main.c -L(库的路径) -l(库的名称)
方式二:gcc -o main main.c 路径/libxxxx.a
2.1生成动态库:
Gcc -shared -fPIC -o libxxx.so *.c
2.2使用动态库:
方式一:Gcc -o main main.c -L(库的路径) -l(库的名称)
方式二:gcc -o main main.c 路径/libxxxx.so
3.1 Linux操作系统加载动态库的路径:默认/lib和/user/lib;
方式一:将自己生成的动态库拷贝到/lib或者/user/lib下;但是只有root用户有权限进入;
方式二:设置环境变量,使操作系统加载库时除了在默认路径下搜索,还需要到用户指定的路径下搜索;
可以在用户目录下创建/lib目录,将自己所写的所有动态库放在该目录下(/home/stu/lib),设置环境变量exeorp LD_LIBRARY_PATH = /home/lib;
exeorp LD_LIBRARY_PATH = 绝对路径;仅仅只对当前终端有效;使环境变量永久有效,修改配置文件/home/user/bashrc,添加所要改变的环境变量;
命令:ldd+可执行文件 显示所有的共享库;
echo+环境变量 查看环境变量;