Linux静态库与动态库
静态库与动态库的区别:
静态库:
- 静态库后缀为 .a 例如 libxxx.a
- 静态库是在程序编译时链接库文件,程序编译后即使删除库文件源码也不影响程序使用。
动态库(共享库):
- 动态库的后缀为 .so 例如 libxxx.so
- 动态库是在程序执行时去链接库文件,程序在执行的时候依然依赖库文件,若删除库文件程序将无法正常执行。
库文件的制作:
main.c 代码如下:
#include <stdio.h>
int main(int argc, const char *argv[])
{
func();
return 0;
}
func.c代码如下:
#include <stdio.h>
void func()
{
printf("Hello World!\n");
}
func.h代码如下
#ifndef __FUNC__H_
#define __FUNC__H_
void func(void);
#endif
如何制作静态库:
将封装函数的代码编译生成执行程序的依赖文件(.o-可重定向文件):
gcc -c func.c -o func.o
生成静态库: (库名:func , lib表示该文件为库文件 , .a表示这个一个静态库)
ar crs libfunc.a func.o
使用静态库:(链接库文件使用-l命令 , -L表示库文件的路径)
gcc main.c -o main -lfunc -L.
linux@ubuntu:~/sourcecode/test$ ls
func.c func.h func.o libfunc.a main main.c
linux@ubuntu:~/sourcecode/test$ ./main
Hello World!
如何制作动态库:
1)将封装函数的代码编译生成执行程序的依赖文件(.o-可重定向文件)-fPIC 在程序执行时,将库保存在合理的内存空间(自动分配)
gcc -c -fPIC func.c -o func.o
2)生成动态库(-shared 生成动态库 )
gcc -shared func.o -o libfunc.so
linux@ubuntu:~/sourcecode/test$ ls
func.c func.h func.o libfunc.so main.c
linux@ubuntu:~/sourcecode/test$
动态库使用的三种方法:
- 将动态库保存在存放动态库的文件中(/lib/ 或者/usr/lib/)
linux@ubuntu:~/sourcecode/test$ sudo cp libfunc.so /lib/
linux@ubuntu:~/sourcecode/test$ gcc main.c -o main -lfunc
linux@ubuntu:~/sourcecode/test$ ./main
Hello World!
或者
linux@ubuntu:~/sourcecode/test$ sudo cp libfunc.so /usr/lib/
linux@ubuntu:~/sourcecode/test$ gcc main.c -o main -lfunc
linux@ubuntu:~/sourcecode/test$ ./main
Hello World!
- 通过环境变量申明动态库的路径 使用export命令将库文件的路径到出到环境变量 LD_LIBRARY_PATH。
linux@ubuntu:~/sourcecode/test$ export LD_LIBRARY_PATH=/home/linux/sourcecode/test/
linux@ubuntu:~/sourcecode/test$ gcc main.c -o main -lfunc
linux@ubuntu:~/sourcecode/test$ ./main
Hello World!
- 用户自定义配置文件申明动态库的路径
linux中有一个关于库文件的配置文件,在/etc/ld.so.conf.d/添加一个自定义的以.conf为后缀的文件,在文件中制定库的路径。
linux@ubuntu:~/sourcecode/test$ cd /etc/ld.so.conf.d/
linux@ubuntu:~/sourcecode/test$ sudo vi func.conf
保存并推出, 刚刚添加好的.conf文件需要使用ldconfig命令刷新一下 刷新库文件后 重新执行即可。
linux@ubuntu:~/sourcecode/test$ sudo ldconfig
linux@ubuntu:~/sourcecode/test$ ls
func.c func.h func.o libfunc.so main main.c
linux@ubuntu:~/sourcecode/test$ ./main
Hello World!
linux@ubuntu:~/sourcecode/test$