静态库和动态库
库文件
库是一个二进制文件,是将 xx.c 编译生成的二进制的机器指令,库又分为动态库和静态库。
linux:
静态库 libxxx.a
动态库 libxxx.so
windows:
静态库 xxx.lib
动态库 xxx.dll
静态库
静态库是以 libxxx.a 格式命名的 lib 是前缀 .a 是后缀 xxx 是库名
如果在编译时使用的是静态库,会将静态库中的机器指令编译到可执行文件中,
可执行文件的体积相对较大,执行效率相对较高。
静态库更新操作比较麻烦,需要重新编译生成可执行文件,否则拿不到新的库里的指令
静态库制作
静态库的制作需要将多个.o 文件打包成一个 libxxx.a 文件,
.o 文件是编译生成的目标文件,是二进制机器指令。
gcc -c xxx.c -o xxx.o
gcc -c xxx1.c -o xxx1.o
gcc -c xxx2.c -o xxx2.o
ar -cr libxxx.a xxx.o xxx1.o xxx2.o
静态库使用
静态库的使用需要在编译时指定静态库的路径,
-I :指定头文件的路径
-L : 指定库文件的路径
-l : (小写的L)指定链接哪个库
gcc main.c -I include_path -L lib_path -lxxx -o main
动态库
动态库是以 libxxx.so 格式命名的 lib 是前缀 .so 是后缀 xxx 是库名
动态库与静态库的区别在于,动态库在程序运行时才加载,
静态库在编译时就已经加载到可执行文件中,程序运行时不再加载。
动态库的更新操作比较方便,只需要更新库文件,不需要重新编译可执行文件。
动态库制作
动态库的制作需要将多个.o 文件打包成一个 libxxx.so 文件,
.o 文件是编译生成的目标文件,是二进制机器指令。
gcc -c xxx.c -o xxx.o
gcc -c xxx1.c -o xxx1.o
gcc -c xxx2.c -o xxx2.o
gcc -shared -o libxxx.so xxx.o xxx1.o xxx2.o
或者
gcc -shared -fPIC -o libxxx.so xxx.c xxx1.c xxx2.c
动态库使用
动态库的使用需要在编译时指定动态库的路径,
-I :指定头文件的路径
-L : 指定库文件的路径
-l : (小写的L)指定链接哪个库
gcc main.c -I include_path -L lib_path -lxxx -o main
将库添加到系统目录
将库添加到系统目录,可以让其他程序调用。
一.一般系统的库目录如下:
可以将自己的库放在系统默认的库的路径下----需要sudo权限
sudo cp libxxx.so /lib
sudo cp libxxx.so /usr/lib
二.也可以将自己的库放在自己指定的目录下,然后在环境变量中添加该目录。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/lib
//如果相对当前用户生效 就把该语句放在 ~/.bashrc 文件中
//如果相对所有用户生效 就把该语句放在 /etc/profile 文件中
这样就可以在任何目录下调用自己的库了。
三.通过修改系统配置文件来设置----需要sudo权限
sudo vim /etc/ld.so.conf.d/libc.conf
将自己的库的路径追加到该文件最后
:wq 保存退出 使用 sudo ldconfig 来重新加载配置