//project1
///dll.h
#ifdef DLLMOUDLE
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
class EXPORT A
{
public:
void print_b();
}
///dll.cpp
void A::print_b(void)
{
printf("bbbbbbbbbbbbbb")
}
//project2
//main.cpp
#include dll.h //對的路徑
void main()
{
A *a = new A();
a->print_b();
}
工程1和工程2在同一個解決方案下,project2依賴于project1,
生成解決方案,產生一個連接錯誤,無法決議的外部符號print_b ,如果我把print_b的實作放到頭檔案dll.h就可以編過,求助各位大神為什么啊!!!好急!!急求!!
uj5u.com熱心網友回復:
你的project2工程沒有引入project1的匯入庫。所以鏈接程式自然找不到符號。你把print_b放入dll.h中進行編譯,相當于直接進行了靜態編譯鏈接。
uj5u.com熱心網友回復:
你說的匯入庫是指dll.lib么?我沒有生成lib啊,是純dll,__declspec(dllexport)這種方式匯出的類參考好像不需要lib啊??
求大神解釋
uj5u.com熱心網友回復:
任何方式匯出、匯入的DLL實作都必須有鏈接體(.lib)檔案。而且這個lib檔案是自動生成的,不需要你明確指定。頭檔案中的__declspec(dllexport)只是一種對匯入指示的特定宣告(用于告訴編譯器不需要生成函式呼叫跳轉陳述句,而是直接呼叫)。uj5u.com熱心網友回復:
自動生成的lib一般在哪個目錄下呢?我搜索不到
uj5u.com熱心網友回復:
取決于你使用的編程工具,如果是VC的話,默認在工程目錄下的(debug) 或者(release)目錄下。uj5u.com熱心網友回復:
我用vs2015
uj5u.com熱心網友回復:
我還有個問題就是,現在有很多dll是直接放到exe目錄就可以直接使用里面的函式或類,這些dll并沒有lib啊
uj5u.com熱心網友回復:
lib檔案僅僅用于可執行檔案的鏈接操作,也就是說可執行檔案生成后就不需要他了。所以執行環境沒有它。
uj5u.com熱心網友回復:
在你的project1的頭檔案里加上一句#pagram (lib,"\你匯出DLL的目錄下的LIB檔案路徑")
ok
uj5u.com熱心網友回復:
.LIB 檔案 跟. DLL 一樣重要。。。。原始碼在編譯后,在.lib里會生成符號目錄,就是的各種函式名,但不含函式執行代碼.但是你的應用程式project1在編譯時候,需要在原始碼里找到相應的符號,從而進行鏈接,因此就需要project2的.lib檔案提供相應的符號資訊,這里的鏈接僅僅是符號鏈接,不會增加你的檔案體積,因為不包含執行體.像你說的執行的時候僅僅需要.DLL檔案就是因為DLL需要動態加載進記憶體,而你的PROJECT1在執行的時候,動態根據鏈接的符號表,尋找記憶體中的DLL,找到相應的執行體,進行執行.所以你發布.EXE檔案的時候,需要提供.DLL檔案一起,但不需要提供.LIB....說白了,.LIB是開發人員編譯連接時候用, .DLL是用戶,運行程式時候用....uj5u.com熱心網友回復:
相關詳細資料,請參考神作<程式員的自我修養-編譯,鏈接,和褲>轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/75942.html
標籤:基礎類
上一篇:函式的執行
下一篇:求C程式的詳細翻譯
