静态库:使用静态库制作工具:ar rcs libname.a a.o b.o c.o
优点:将函数库中的函数本地化。寻址方便,速度快。
缺点:每个使用静态库的进程都要将库编译到可执行文件中加载到内存。内存消耗严重
动态库:
1 生成“与位置无关”的目标文件gcc -fPIC a.c b.c c.c –c(参数 -fPIC 表示生成与位置无关代码)
2 使用gcc -shared选项:gcc -shared -o libname.so a.o b.o c.o
优点:多进程共享一份库文件,节省内存、易于更新
缺点:相较于静态库而言库函数访问略慢。
静态库
SrcFiles = $(wildcard ./src/*.c)
ObjFiles = $(patsubst %.c,%.o,$(SrcFiles))
path = -I./include
app1:libzjc.a
gcc main.c -o $@ $(path) -L ./ -l zjc
libzjc.a:$(ObjFiles)
ar -rcs $@ $(ObjFiles)
%.o:%.c
gcc -c $< $(path) -o $@
clean:
-@rm -f ./src/*.o
-@rm -f app1
动态库
SrcFiles = $(wildcard ./src/*.c)
ObjFiles = $(patsubst %.c,%.o,$(SrcFiles))
path = -I./include
app2:libzjc.so
gcc main.c -o $@ $(path) -L ./ -l zjc
libzjc.so:$(ObjFiles)
gcc -shared -o $@ $(ObjFiles)
%.o:%.c
gcc -c $< -fPIC $(path) -o $@
clean:
-@rm -f ./src/*.o
-@rm -f app2
-@rm -f libzjc.so
找不到动态库.so的问题
第一种:
使用环境变量 LD_LIBRARY_PATH
○ 动态库的绝对路径添加到该环境变量中
○ LD_LIBRARY_PATH = /usr/include/xxx:$LD_LIBRARY_PATH
○ export LD_LIBRARY_PATH
直接在shell中 - 临时设置
写入配置文件
□ ~/.bashrc - 用户级别
□ /etc/prefile - 系统级别
第二种:
给动态库设置软连接 /usr/kevin/fastdfs
○ 将软链接放到 /usr/lib /usr/lib64 /lib /lib64
○ sudo ln -s /usr/kevin/fastdfs/xxx.so /usr/lib/libxxx.so
第三种:
刷新 /etc/ld.so.cache
首先 vi /etc/ld.so.conf
将动态库的绝对路径写入该文件中
sudo ldconfig -v