关于动态库的制作介绍

今天简单的介绍下动态的制作,主要介绍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 [email protected]
25     @cp [email protected] $(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 [email protected]
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

时间: 2024-08-08 14:36:50

关于动态库的制作介绍的相关文章

Linux下静态库和动态库的制作与使用

p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: "Times New Roman", serif } h2 { margin-top: 14.0pt; margin-right: 0cm; margin-bottom: 14.0pt; margin-left: 28.8pt;

Linux下C++静态库、动态库的制作与使用

参考博文:C++静态库与动态库 >> 静态库 1. 静态库的制作 a) 编辑 name.cpp 和name.h文件 b) $g++ -c name.cpp //注意带参数-c,否则直接编译为可执行文件 c) $ar -crv libname.a name.o  //通过ar工具将目标文件打包成.a静态库文件 2静态库的使用 a) 所用程序中包含静态库的头文件 b)$g++ useStaticLibray -L ./StaticDirectory -l name //只需要在编译的时候,指定静态

静态库与动态库的制作

1.相关知识 (1).不管是制作静态库还是动态库,都得对.o文件进行打包: (2).在/lib64目录下,静态库文件.a,动态库文件.so 2.静态库 (1).gcc -c add.c    ------> 生成add.o文件,其中通过参数(-c): (2).静态库由命令ar创建:  ar  -cr  add.a  add.o   (3).静态库的编译有两种方法:   a:gcc test.c -o test -L. add.a     //每次都得在编译时加上-L. 静态库文件: b.将.a文

linux 下动态库的制作及使用

1.动态链接库的制作 动态链接库与普通的程序相比,没有main函数. 通过 -shared 和 -fPIC 编译参数产生 .so 动态链接库文件.程序在调用库函数时 只要链接上这个库即可. 1)编写动态库代码 定义头文件 reader.h #ifndef READER_H_ #define READER_H_ int open(char *name); int close(char *name); #endif // READER_H_ 编写函数体 reader.c #include <stdi

Linux中的动态库(共享库)的制作

一.整体大纲 二.共享库的制作 1. 命名规则: lib + 名字 + .so 2. 制作步骤: 1) 生成与位置无关的代码 (生成与位置无关的.o)    2) 将.o打包成共享库(动态库) 3. 发布和使用共享库: 4. 解决程序执行时动态库无法被加载的问题: 1)放到系统的库目录 中 -- 不允许使用 2)临时测试 环境变量: LD_LIBRARY_PATH=将动态库的路径设置给该变量          将设置的值, 导入到系统环境变量中: export LD_LIBRARY_PATH 

静态库和动态库的分析

本质上来说库是一种可执行代码的二进制形式. linux下的库有两种:静态库和共享库(动态库) 静态库在程序编译时会被连接到目标代码中:程序运行时将不再需要该静态库,因此体积较大. 优点:程序运行时将不再需要该静态库 缺点:可执行文件的体积较大. 相同的库可能会需要被多次加载. 静态库: libxxxxx.a 动态库:动态库在程序编译时并不会被连接到目标代码中, 优点: 在程序运行时动态库才会被载入内存,因此代码体积较小. 缺点: 因此在程序运行时还需要动态库存在. 静态库的制作:将功能函数编译成

静态库和动态库

简介 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 为什么制作闭源库 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用 例如:百度地图,友盟,JPush等 在企业开发中,一些核心技术或者常用框架,出于安全性和稳

C库的制作

1.库的概念:库是一种可执行的二进制形式: 2.分类: 1>静态库 ①.在程序编译时会被连接到目标代码中: ②.程序运行时不再需要该静态库: ③.体积较大: 2>动态库/共享库 ①.在程序编译时不会被连接到目标代码中,而是在程序运行时才被载入内存中: ②.在程序运行时需要动态库存在: ③.代码体积较小: 3.库的制作: 1>静态库的制作: ①.创建静态库的源代码: testlib.c int fun(int a){ return a * a: } ②.将静态库的源代码编码成.O文件 gc

skynet中动态库的处理

skynet中的.so动态库由service-src中的c文件编译完后生成,其中最重要的是snlua.c. 源码地址:https://github.com/cloudwu/skynet/service-src 这里不介绍如何生成动态库,而是介绍当编译成动态库后,skynet是如何利用里边的函数的. 源码: #include "skynet.h" #include <lua.h> #include <lualib.h> #include <lauxlib.h