zoukankan      html  css  js  c++  java
  • 关于动态库的制作介绍

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

  • 相关阅读:
    MySQL -- 表联结
    Unittest方法 -- 项目实现自动发送邮件
    Linux工作中常用命令
    Requests方法 -- Token获取操作
    Requests方法 -- 关联用例执行
    Requests方法 -- Blog流程类进行关联
    Requests方法 -- 参数化
    defer和async的区别
    js函数收藏:获取cookie值
    XSHELL使用技巧总结
  • 原文地址:https://www.cnblogs.com/liunianshiwei/p/6108043.html
Copyright © 2011-2022 走看看