关于动态库的制作介绍

Posted 流年十维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于动态库的制作介绍相关的知识,希望对你有一定的参考价值。

今天简单的介绍下动态的制作,主要介绍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

 

以上是关于关于动态库的制作介绍的主要内容,如果未能解决你的问题,请参考以下文章

Linux 静态库和共享(动态)库的创建与使用详解

C库的制作

IOS 静态库的和.framework制作

[Linux 高并发服务器]制作静态库与动态库

linux下静态库和动态库的制作

静态函数库的制作和使用