c语言将程序写为动态库,VS下生成C程序静态库(LIB)及动态库(DLL)的方法
一、前言
工作中有時候因為分工合作的原因需要讓別人調用自己寫的代碼去完成某項功能,但是又不想讓別人看到具體的實現過程,只是提供一個API形式的接口供別人調用;又或者是其他的一些原因,有必要學習靜態庫及動態庫的相關知識,本文大多數內容均為參考網上資料后的整理,作為學習的總結。
二、DLL與LIB文件的區別
lib是一個二進制文件,與dll類似,供其他程序調用。lib與dll的區別是:dll是運行時需要的,lib是編譯時需要的。
1、共有兩種庫:
(1)一種是LIB包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時加載在進程空間中的DLL提供,稱為動態鏈接 庫dynamic link library。
(2)一種是LIB包含函數代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態鏈接庫static link library。
2、共有兩種鏈接方式:
(1)動態鏈接使用動態鏈接庫,允許可執行模塊(.dll文件或.exe文件)僅包含在運行時定 位DLL函數的可執行代碼所需的信息。
(2)靜態鏈接使用靜態鏈接庫,鏈接器從靜態鏈接庫LIB獲取所有被引用函數,并將庫同代碼一起放到可執行文件 中。
3、關于lib和dll的區別如下:
(1)lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要 lib;如果要使動態鏈接的程序運行起來,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,記錄了dll中函數的入口和位 置,dll中是函數的具體內容;如果只有lib文件,那么這個lib文件是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib文件,在運行程序時 不需要再掛動態庫,缺點是導致應用程序比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程序才行。
(3)動態鏈接的情況下,有兩個文件:一個是LIB文件,一個是DLL文件。LIB包含被DLL導出的函數名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到DLL 文件。在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了內存資源。DLL和LIB文件必須隨應用程序 一起發行,否則應用程序會產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。
4、使用lib需注意兩個文件:
(1).h頭文件,包含 lib中說明輸出的類或符號原型或數據結構。應用程序調用lib時,需要將該文件包含入應用程序的源文件中。
(2).LIB文件,略。
5、使用dll需注意三個文件:
(1).h頭文件,包含dll中說明輸出的類或符號原型或數據結構的.h文件。應用程序調用dll時,需要將該文件包含 入應用程序的源文件中。
(2).LIB文件,是dll在編譯、鏈接成功之后生成的文件,作用是當其他應用程序調用dll時,需要將該文件引入應用 程序,否則產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。
(3).dll文件,真正的可執行文件,開發成功后的應用 程序在發布時,只需要有.exe文件和.dll文件,并不需要.lib文件和.h頭文件。
三、VS下生成靜態庫(LIB)
新建VS2010項目,注意選擇Win32項目,而不是MFC DLL項目。MFC DLL 和win32 DLL的差別就是一個使用MFC類庫,一個不使用如果你代碼中用到了MFC,那么一定要創建MFC DLL,因為win32 DLL用不了MFC類。
下一步,最好不要選預編譯選項!選預編譯頭的話,就在.cpp文件中添加 #include "StdAfx.h"
然后添加進來.h和.cpp文件,就可以直接點生成解決方案了。別點調試,因為沒有入口函數。這里要注意你生成lib的項目配置屬性要和你使用此lib的項目配置屬性要保持一致 。將.h文件和生成的lib文件拷到你的項目中并添加,就可以使用了。
若出現錯誤error LNK2005: ___xi_a 已經在 msvcrt.lib(cinitexe.obj) 中定義,解決辦法:屬性::C++::運行時庫,確保該項目和所引用的所有的庫都是相同的選項,如release版本時都選擇"多線程dll"。
四、VS下生成動態庫(DLL)
1、生成
(1)文件——新建——項目,選擇如下圖
(2)新建頭文件test.h和源文件test.c
//test.h
__declspec(dllexport) int sum(int a, int b);
//test.c
#include "test.h"
#include
int sum(int a, int b) {
return a + b;
}
(3)右擊項目選擇生成,在debug中會產生多個文件,我們只需要dllgen.dll和dllgen.lib
2、使用
(1)文件——新建——項目——空項目
(2)將dllgen工程中的test.h、dllgen.dll、dllgen.lib拷貝到當前工程下
(3)在工程中添加test.h,同時新建main.c
//main.c
#include "test.h"
#include
#include
#pragma comment(lib,"dllgen.lib")
void main() {
int n;
n = sum(10, 6);
printf("10 + 6 = %d\n",n);
system("pause");
}
(4)運行項目,查看測試結果
五、加載lib/頭文件和DLL的方法
1、加載lib/頭文件
(1)適用于當前項目
1 第一步:項目->屬性->C/C++->常規->附加包含目錄(瀏覽.h文件的路徑) 添加包含文件。
2 第二步:項目->屬性->C/C++->鏈接器->輸入->附加依賴項(寫入lib的名稱) 添加庫文件。
3 項目->屬性->C/C++->鏈接器->輸入->附加依賴項,添加用到的lib 。
4 第三步:在要使用cpp文件前加入 #include (注意文件的路徑)。
(這一步也可以在代碼中顯示調用 #pragma comment(lib, "***.lib") )(若不添加,連接報錯:無法解析的外部符號)。
(2)適用于所有項目,設置好后即使重建新項目也不需重新設置。
1 Tools->Options->Projects and Solutions->VC++ Directories ->Show directories for:(選擇include files)->添加.h路徑
2 Tools->Options->Projects and Solutions->VC++ Directories ->Show directories for:(選擇Library files)->添加lib路徑
(這些路徑只告訴編譯器怎么找文件,沒有說把那里面的文件加入工程.)
(若不設置,編譯報錯:無法打開***文件)。
2、加載DLL
將dll文件拷貝到工程debug文件下(如果不拷貝,編譯鏈接不報錯,運行報錯:無法找到***.dll)。
六、參考文章地址:
心城追夢
發布了8 篇原創文章 · 獲贊 15 · 訪問量 2334
私信
關注
標簽:文件,LIB,lib,應用程序,dll,VS,DLL
來源: https://blog.csdn.net/qq_34254642/article/details/104091651
總結
以上是生活随笔為你收集整理的c语言将程序写为动态库,VS下生成C程序静态库(LIB)及动态库(DLL)的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux centos8下载,在Cen
- 下一篇: c语言程序阅读题库,C语言程序设计-阅读