關於動態庫的制作介紹


今天簡單的介紹下動態的制作,主要介紹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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM