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