关于动态库的制作介绍
今天简单的介绍下动态的制作,主要介绍windows平台下借助vs进行动态库制作和使用,以及linux下动态库的制作和使用,闲话少说下面开始吧
在windows环境下进行制作
1.首先打开vs2013,新建一个win32控制台项目
第二步,新建选择动态库(dll)选项,生成空项目
第三步:将提供的源码文件添加到项目中,其中keymng_msg.h和keymng_msg.c是最外层封装的文件,底层实现是另外两个文件,所以只需要给用户提供动态库和keymng_msg.h就可以调用.
第四步:在需要导出的函数接口的头文件中的函数声明前添加 __declspec(dllexport),对应的.c文件也要添加
例如如下图所示:
第五步:编译程序,查看是否编译成功
第六步:进入到工程目录下的上一级目录Debug下面,查看生成的动态库文件
第七步:新建一个项目,将测试代码添加进来,并将动态库拷贝到当前工程目录下
第八步:打开项目"属性",点击"链接器"下面的"输入"菜单,在"附加依赖项"中编辑添加生成的动态库的lib文件
第九步:点击编译并执行
注意要点:
动态库的项目名称不要死中文
mymsgreal.lib 是对 mymsgreal.dll描述
__declspec(dllexport) .h .c都要添加
动态库头文件要最小化原则
在windows环境下进行制作
首先介绍第一种制作动态库的方式:
命名规则: libxxx.so
制作步骤:
1. 生成.o文件 -> .c .cpp
gcc -fpic(-fPIC) -c *.c
2. 将.o文件打包为.a文件 -- 使用gcc 需要加参数 -shared
gcc -shared -o libxxx.so *.o
使用库和头文件+main.c生成可执行程序:
gcc main.c -Iinclude -L./lib -lCalc -o aabb
-L: 指定库的路径
-l: 指定库的名字(掐头去尾 ) libabc.so -> abc
解决动态库找不到的问题:
1. export LD_LIBRARY_PATH=库的目录:$LD_LIBRARY_PATH -- 临时的设置
2. 永久生效: 把上面的代码写入 ~/.bashrc /etc/profile
3. 更新 /etc/ld.so.cache文件列表
(1) 打开/etc/ld.so.conf -- 在里边写入动态库的绝对路径
(2) 执行一个命令: sudo ldconfig -v -- 更新/etc/ld.so.cache文件列表
第一种方法比较简单,按上述步骤执行即可,但是发现比较繁琐,需要敲一些列的命令,并且要有相应的环境
下面我们介绍第二种方法,利用makefile文件的自动编译功能,进行编译并测试一下
第一步:首先在工程目录下新建两个文件夹src和incl分别用来放.c文件和.h文件,便于代码管理
第二步:根据需要编译的文件,编写合适的makefile文件,
注意的几点是,按上述动态库制作规则编写,并且将生成的.so文件拷贝到当前用户的lib文件夹下
1 # Makefile Module For Develop Team 2 3 .SUFFIXES: 4 .SUFFIXES: .c .o 5 6 WORKDIR=. 7 INCLDIR=$(WORKDIR)/incl 8 LIBDIR=$(HOME)/lib 9 BINDIR=$(HOME)/bin 10 11 CC=gcc 12 13 INCLFLG= -I$(INCLDIR) 14 LIBFLG = -L$(LIBDIR) 15 CFLAG= -c -g $(INCLFLG) 16 LIBS = 17 18 VPATH = $(WORKDIR)/src 19 20 21 OBJ7 = itcast_asn1_der.o itcastderlog.o keymng_msg.o 22 23 libmymessagereal.so: $(OBJ7) 24 $(CC) -shared -fPIC $^ -o $@ 25 @cp $@ $(LIBDIR) 26 # gcc -shared -fPIC itcast_asn1_der.o itcastderlog.o keymng_msg.o -o libmymessagereal.so 27 28 .c.o: 29 # $(CC) -shared -fPIC $(CFLAG) $< -D_ITCAST_OS_LINUX -DMEMWATCH -DMW_STDIO 30 $(CC) -shared -fPIC $(CFLAG) $< -D_ITCAST_OS_LINUX 31 32 # gcc -shared -fPIC -c -g -I./incl 33 34 .PHONY : clean 35 clean : 36 rm -f *.o 37 rm -f *.s
第三步:执行makefile文件,输入make,观察是否生成动态库,并观察是否将动态库拷贝到当前用户的lib目录下
第四步:测试并调用该动态库,将测试代码也分文件存放,编写makefile文件,进行编译后,调用制作好的动态库执行程序,结果如下
附:测试代码的makefile文件
1 # Makefile 2 .SUFFIXES: 3 .SUFFIXES: .c .o 4 5 all: keymng_msgtest 6 7 CC = gcc 8 9 WORKDIR=. 10 LIBDIR=$(HOME)/lib 11 LIBS = -L$(LIBDIR) -lmymessagereal 12 OUTDIR=$(HOME)/bin 13 14 INCLDIR=$(WORKDIR)/incl 15 INCLFLG= -I$(WORKDIR)/incl 16 CFLAG= $(INCLFLG) -g -c -Wall 17 18 VPATH = $(WORKDIR)/src 19 20 OBJ1 = keymng_msgtest.o 21 22 keymng_msgtest:$(OBJ1) 23 $(CC) $(LIBS) $^ -o $@ 24 25 #testmsgreal:testkeymngmsg.o testkeymngmsg2.o testkeymngmsg3.o 26 # gcc -L/home/it01/lib -lmymessagereal testkeymngmsg.o testkeymngmsg2.o testkeymngmsg3.o -o testmsgreal 27 28 .c.o: 29 $(CC) $(CFLAG) $< 30 31 #*.o:*.c 1.c 2.c 3.c 32 # gcc -I./incl -g -c -Wall $< 33 34 # gcc -I./incl -g 1.c -c 1.o 35 # gcc -I./incl -g 2.c -c 2.o 36 # gcc -I./incl -g 3.c -c 3.o 37 38 39 .PHONY:clean 40 clean: 41 -rm -f *.o 42 -rm -f keymng_msgtest 43 -rm *.ber
总结:windows下制作动态库,主要依靠编译器帮助我们完成了大部分工作,我们需要配置好动态库路径才可以调用;
在linux下面我们需要手动通过命令来编译,或者自己按照规则来编写makefile文件来编译,也能实现相同的效果,但是linux下需要注意动态库的存放路径,可执行程序需要能够调用到该目录下的动态库才能成功.
其实linux下还有还有制作静态库的方法,只是由于局限性,使用的不是很多,下面简单罗列一下大概步骤
静态库的制作和使用*.lib
命名规则: libxxx.a
制作步骤:
1. 生成.o文件
gcc -c *.c
2. 将.o文件打包为.a文件 -- 使用ar工具
ar rcs 库的名字(libCalc.a) *.o
使用静态库:
1. 提供一个测试文件main.c
2. 使用库和头文件+main.c生成可执行程序:
gcc main.c -Iinclude -L./lib -lCalc -o aabb
-L: 指定库的路径
-l: 指定库的名字(掐头去尾 ) libabc.a -> abc