vs如何配置lib庫
『壹』 C語言vs怎麼使用自己做的靜態庫與動態庫,本人小白,請求詳解
1.靜態鏈接庫
打開VS2010,新建一個項目,選擇win32項目,點擊確定,選擇靜態庫這個選項,預編譯頭文件可選可不選。
在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cpp
static.h文件:
[cpp]view plain
#ifndefLIB_H
#defineLIB_H
extern"C"intsum(inta,intb);
#endif
- static.cpp文件:
#include"static.h"
intsum(inta,intb)
{
returna+b;
}
- 編譯這個項目之後,會在debug文件夾下生成static.lib文件,這個就是我們需要的靜態鏈接庫。
#include<stdio.h>
#include<stdlib.h>
#include"static.h"
#pragmacomment(lib,"static.lib")
intmain()
{
printf("%d ",sum(1,2));
system("pause");
return0;
}
- 編譯運行可得結果:3
#ifndefDYNAMIC
#defineDYNAMIC
extern"C"__declspec(dllexport)intsum(inta,intb);
#endifDYNAMIC
#include"dynamic.h"
intsum(inta,intb)
{
returna+b;
}
- 編譯這個項目,會在debug文件夾下生成dynamic.dll文件。
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include"dynamic.h"
intmain()
{
HINSTANCEhDll=NULL;
typedefint(*PSUM)(inta,intb);
PSUMpSum;
hDll=LoadLibrary(L"dynamic.dll");
pSum=(PSUM)GetProcAddress(hDll,"sum");
printf("%d ",pSum(1,2));
system("pause");
FreeLibrary(hDll);
return0;
}
- 編譯運行結果為:3
[cpp]view plain
下面說明如何調用靜態鏈接庫。
首先需要新建一個空項目,起名為test。將之前static項目下的static.h和static.lib這個2個文件復制到test項目的目錄下,並在工程中加入static.h文件。
新建一個test.cpp文件如下:
[cpp]view plain
#pragma comment(lib,"static.lib"),這一句是顯式的導入靜態鏈接庫。除此之外,還有其他的方法,比如通過設置路徑等等,這里不做介紹。
2.動態鏈接庫
和創建靜態鏈接庫一樣,需要創建一個空的win32項目,選擇dll選項。創建dynamic.cpp和dynamic.h文件
dynamic.h文件:
[cpp]view plain
dynamic.cpp文件:
[cpp]view plain
下面介紹如何調用動態鏈接庫,這里講的是顯式的調用。
在剛才的test項目下,把static.lib和static.h文件刪除,把dynamic.h和dynamic.dll復制到該目錄下,並在項目中添加dynamic.h文件,修改test.cpp文件為:
[cpp]view plain
特別提示:
1.extern "C"中的C是大寫,不是小寫
2.如果從VS2010中直接運行程序,lib和dll需要放到test項目的目錄下;如果想雙擊項目test下的debug文件中的exe文件直接運行的話,需把lib和dll放入debug文件夾下。
『貳』 如何在編譯器里設置調用別人寫好的lib和dll步驟
如何在編譯器(vs2008)里設置調用別人寫好的lib和dll如何在編譯器(vs2008)里設置調用別人寫好的lib和dll步驟:1.Tools->options->projectsandsolutions->VC++directories分別在包含文件,庫文件填加了路徑(這些路徑只告訴編譯器怎麼找文件,沒有說把那裡面的文件加入工程.)(若不設置,編譯報錯:無法打開***文件)2.Project->properties->c/c++->general->additionalincludedirectories添加包含文件Project->properties->linker->general->additionallibrarydirectories添加庫文件Project->properties->linker->input->添加用到的lib(這一步也可以在代碼中顯示調用#pragmacomment(lib,"***.lib"))(若不添加,連接報錯:無法解析的外部符號)3.將dll文件拷貝到工程debug文件下(如果不拷貝,編譯鏈接不報錯,運行報錯:無法找到***.dll)切記第三條,讓老子排查了一上午,當然最好把所有輸出目錄定位到一個文件下面。附:DLL與LIB文件的區別共有兩種庫:一種是LIB包含了函數所在的DLL文件和文件中函數位置的信息(入口),代碼由運行時載入在進程空間中的DLL提供,稱為動態鏈接庫dynamiclinklibrary。一種是LIB包含函數代碼本身,在編譯時直接將代碼加入程序當中,稱為靜態鏈接庫staticlinklibrary。共有兩種鏈接方式:動態鏈接使用動態鏈接庫,允許可執行模塊(.dll文件或.exe文件)僅包含在運行時定位DLL函數的可執行代碼所需的信息。靜態鏈接使用靜態鏈接庫,鏈接器從靜態鏈接庫LIB獲取所有被引用函數,並將庫同代碼一起放到可執行文件中。關於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文件,可以用WIN32API函數LoadLibrary、GetProcAddress裝載。使用lib需注意兩個文件:(1).h頭文件,包含lib中說明輸出的類或符號原型或數據結構。應用程序調用lib時,需要將該文件包含入應用程序的源文件中。(2).LIB文件,略。使用dll需注意三個文件:(1).h頭文件,包含dll中說明輸出的類或符號原型或數據結構的.h文件。應用程序調用dll時,需要將該文件包含入應用程序的源文件中。(2).LIB文件,是dll在編譯、鏈接成功之後生成的文件,作用是當其他應用程序調用dll時,需要將該文件引入應用程序,否則產生錯誤。如果不想用lib文件或者沒有lib文件,可以用WIN32API函數LoadLibrary、GetProcAddress裝載。(3).dll文件,真正的可執行文件,開發成功後的應用程序在發布時,只需要有.exe文件和.dll文件,並不需要.lib文件和.h頭文件
『叄』 編譯錯誤,如何解決error LNK2001: unresolved external symbol
導致「error LNK2001: unresolved external symbol」的原因為getStats此方法的鏈接庫沒有找到。很可能是工程中引用了第三方開源庫或者自己編譯生成的庫,且只用了頭文件,而沒有將對應的lib文件路徑加入到工程中。
具體解決方法為(此方法針對vs系列集成開發環境):
1.如果還未引入頭文件,那麼可以右鍵點擊項目,然後點擊「屬性」。