利用的代码(在网盘中 稍后有时间会附上)
动态与静态库的作用
1.分离编译
2.代码重用
分类:
前提:array.cpp array_test.cpp alg.cpp
静态库
1.首先完成makefile制作:
OBJS:array.o alg.o array_test.o
DEST:array_test
.PHONY: all clean
all:$(DEST)
$(DEST):($OBJS)
$(CXX) $(CXXFLAGS) $^ -o $@
$(OBJS):%.o:%.cpp
$(CXX) $(CXXFLAGS)$< -c -o $@
clean:
rm -f $(DEST) $(OBJS)
2.静态库打包:
ar -rcs libarralg.a alg.o array.o
3.编译操作
法1:g++ -o array_test array_test.o -L. -larralg (看不出来是静态库还是动态库)
法2:g++ -o array_test array_test.o ./libarralg.a
3.重新编写makefile 文件
OBJS:array.o alg.o
LIB=arralg.a
DEST:array_test
.PHONY: all clean
all:$(DEST)
$(DEST):array_test.cpp $LIB
$(CXX) $(CXXFLAGS) $< -o $@ -L. -larralg
$(LIB):$(OBJS)
ar -rcs $(LIB) $^
$(OBJS):%.o:%.cpp
$(CXX) $(CXXFLAGS)$< -c -o $@
clean:
rm -f $(DEST) $(OBJS)
共享库(动态链接库)
OBJS:array.o alg.o
LIB=libarralg.so
DEST:array_test
.PHONY: all clean
all:$(DEST)
$(DEST):array_test.cpp $LIB
$(CXX) $(CXXFLAGS) $< -o $@ ./$(LIB)
$(LIB):$(OBJS)
$(CXX) -shared -o $(LIB) $^
$(OBJS):%.o:%.cpp
$(CXX) $(CXXFLAGS) $< -fPIC -c -o $@
clean:
rm -f $(DEST) $(OBJS) $(LIB) array_test.o
注意:
库一定要放在命令行的末尾
动态加载库
OBJS:array.o alg.o
LIB=libarralg.so
DEST:array_test
.PHONY: all clean
all:$(DEST)
$(DEST):array_test.cpp $LIB
$(CXX) $(CXXFLAGS) $< -o $@ -ldl
$(LIB):$(OBJS)
$(CXX) -shared -o $(LIB) $^
$(OBJS):%.o:%.cpp
$(CXX) $(CXXFLAGS) $< -fPIC -c -o $@
clean:
rm -f $(DEST) $(OBJS) $(LIB) array_test.o
总结:动态库(共享库,动态加载库)与静态库的区别
动态加载
1.灵活,可以在需要的时候进行加载,在不需要的时候进行卸载,这样可以不必占用内存。
2.可以在没有动态库时候发现,而不致程序报错。
3.加载程序中有条件才运行的库。
4.热更新,在不停止程序的前提下进行更新。
5.复杂一些,需要显示获得函数地址。
静态加载
1.简单方便
2.没有找到动态库时,系统报错
3.加载运行很久的库
补充