Linux 静态库动态库 Makefile 制作

来源:互联网 发布:java enum interface 编辑:程序博客网 时间:2024/05/17 03:08

静态库:使用静态库制作工具: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