静态库: .a后缀 动态库: .so后缀
当动静态库同时存在的时候, 默认优先使用动态库
1.1生成动静态库
Archive files 归档文件 r : replace c : create
命令:
ar -rc lib库名.a mymath.o myprint.o
//例如:
ar -rc libhello.a mymath.o myprint.o
Makefile:
libhello.a:mymath.o myprint.oar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o:myprint.cgcc -c myprint.c -o myprint.o.PHONY:output
output:mkdir -p output/includemkdir -p output/libcp -rf *.h output/includecp -rf *.a output/lib.PHONY:clean
clean:rm -rf *.a output *.o
1.2使用静态库
1.告诉gcc头文件和库的路径在那
gcc main.c -I ./output/include/ -L ./output/lib/ -lhello-I: include (头文件) -L: lib(库) -lhello -l(link),去掉前缀lib,后缀.a
2.拷贝库到系统下(库的安装)
sudo cp output/include/* /usr/include //拷贝头文件
sudo cp output/lib/libhello.a /lib64 //拷贝静态库//不建议这么做,避免自己写的文件,污染系统库.
2.1生成动态库
生成.o文件
gcc -fPIC -c mymath.c -0 mymath.o
生成动态库
gcc -shared myprint.o mymath.o libhello.so
Makefile
libhello.so:mymath_d.o myprint_d.ogcc -shared mymath_d.o myprint_d.o -o libhello.so
mymath_d.o:mymath.c gcc -c -fPIC mymath.c -o mymath_d.o
myprint_d.o:myprint.c gcc -c -fPIC myprint.c -o myprint_d.o .PHONY:output
output:mkdir -p output/includemkdir -p output/libcp -rf *.h output/includecp -rf *.so output/lib.PHONY:clean
clean:rm -rf output *.o *.out *.so
2.2使用动态库
1. 加static(摒弃优先使用动态库的原则, 使用静态库)
gcc main.c -I ./output/include/ -L ./output/lib/ -lhello -static
2.配置环境变量 LD_LIBRARY_PATH(内存级别, 重新登录就失效)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:绝对路径(不用带库名)
3.修改配置文件
sudo touch /etc/ld.so.conf.d/文件名.conf //创建文件
sudo vim /etc/ld.so.conf.d/文件名.conf //然后把库的路径放进去就行更新:sudo ldconfig删除:sudo rm /etc/ld.so.conf.d/文件名.confsudo ldconfig
4.软链接添加到系统默认路径(不推荐)
添加路径:sudo ln -s 动态库路径(绝对路径)/lib64/libhello.so(库名)
删除:sudo unlink /lib64/库名