第五天2017/04/06(下午3:静态链接库(Lib))
原文鏈接:http://blog.csdn.net/xiaoding133/article/details/8973436
一、靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)
1.靜態(tài)鏈接庫(kù)(.LIB):函數(shù)和數(shù)據(jù)被編譯進(jìn)一個(gè)二進(jìn)制文件。發(fā)布時(shí),只需要發(fā)布這個(gè)可執(zhí)行文件,并不需要發(fā)布被使用的靜態(tài)庫(kù)。
2.動(dòng)態(tài)庫(kù)(.DLL):在使用動(dòng)態(tài)庫(kù)的時(shí)候,往往提供兩個(gè)文件:一個(gè)引入庫(kù)(.lib)文件和一個(gè)DLL(.dll)。雖然引入庫(kù)和靜態(tài)庫(kù)的后綴名相同,但是差別很大。對(duì)于一個(gè)DLL來說,其引入庫(kù)文件包含該DLL導(dǎo)出的函數(shù)和變量的符號(hào)名,而.dll文件包含DLL的實(shí)際的函數(shù)和數(shù)據(jù)。在使用動(dòng)態(tài)鏈接庫(kù)的情況下,在編譯鏈接可執(zhí)行文件時(shí),只需要DLL的引入庫(kù)文件,而在運(yùn)行可執(zhí)行程序時(shí),需要加載所需要的DLL,“發(fā)布產(chǎn)品時(shí),需要發(fā)布調(diào)用的動(dòng)態(tài)鏈接庫(kù)”。
二、靜態(tài)鏈接庫(kù)的創(chuàng)建和引用
【創(chuàng)建靜態(tài)庫(kù)】 //DLL.h頭文件聲明2個(gè)函數(shù):一個(gè)在.cpp中實(shí)現(xiàn),一個(gè)在.c中實(shí)現(xiàn)#ifndef _LIB_H_ #define _LIB_H_ #ifdef __cplusplus #include <iostream> using namespace std; extern "C" { #endifint add(int a, int b); void show(); #ifdef __cplusplus }; #endif#endif ------------------------------------------------------------------------------------------ //define_add.cpp中實(shí)現(xiàn)add()函數(shù) #include "LIB.h" int add(int a,int b) { #ifdef __cplusplusprintf("DLL生成使用成功:add()函數(shù) —— C++編譯環(huán)境\n");return a+b; #elseprintf("DLL生成使用成功:add()函數(shù) —— C編譯環(huán)境\n");return a+b; #endif } ------------------------------------------------------------------------------------------ //define_show.c中實(shí)現(xiàn)show()函數(shù)#include "LIB.h"void show() { #ifdef __cplusplusprintf("\nDLL生成使用成功:show()函數(shù) —— C++編譯環(huán)境\n"); #elseprintf("\nDLL生成使用成功:show()函數(shù) —— C編譯環(huán)境\n"); #endif }【注解】創(chuàng)建和調(diào)用LIB與DLL的相同點(diǎn)、不同點(diǎn) 與創(chuàng)建動(dòng)態(tài)庫(kù)DLL相同點(diǎn):可以實(shí)現(xiàn)C與C++的混合編程#ifdef __cplusplus extern "C"{#endif //函數(shù)的聲明 #ifdef __cplusplus }#endif 、創(chuàng)建LIB靜態(tài)庫(kù)時(shí),在.h聲明函數(shù),.c或.cpp中實(shí)現(xiàn)函數(shù),.c或.cpp中調(diào)用函數(shù) 、#ifdef...#else...#endif(#ifdef __cplusplus...#else...#endif) 、 防止重定義頭文件#ifndef...#define...#endif 、 #define 與創(chuàng)建動(dòng)態(tài)庫(kù)DLL不同點(diǎn):__declspec(dllexport)不是必須的(是可有可無),但是在創(chuàng)建DLL時(shí)該關(guān)鍵字是必須的。=========================================================================================== 【使用靜態(tài)庫(kù)LIB.lib】 將上面生成的LIB.lib和LIB.h文件拷貝到新建工程項(xiàng)目的目錄下,并且添加下面代碼://main.c調(diào)用LIB.lib中的2個(gè)函數(shù) #include "LIB.h"#pragma comment(lib,"LIB.lib")int main() {printf("add(1,2) = %d\n",add(1,2));show();getchar(); }--------------------------------------------------------- //main.cpp調(diào)用LIB.lib中的2個(gè)函數(shù)#include "LIB.h" #pragma comment(lib,"LIB.lib")int main() {cout<<"add(1,2) = "<<add(1,2)<<endl;show();getchar(); } 【仔細(xì)一點(diǎn)你會(huì)發(fā)現(xiàn):在main.c和main.cpp代碼中輸出部分有微小差別】因?yàn)閙ain.c文件中沒有cout、endl等關(guān)鍵字,所以我們用stdio.h里邊的關(guān)鍵字printf進(jìn)行輸出。總結(jié)
以上是生活随笔為你收集整理的第五天2017/04/06(下午3:静态链接库(Lib))的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第五天2017/04/06(下午1:C、
- 下一篇: 第五天2017/04/06(下午2:动态