我開始使用隱式鏈接學習DLL。我並不完全瞭解它是如何工作的。請糾正我錯在哪裏。 我無法編譯下一個代碼(3個模塊):隱式鏈接DLL問題
MyLib.h
#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" __declspec(dllimport)
#endif
MYLIBAPI int g_nResult;
MYLIBAPI int Add(int nLeft, int nRight);
據我理解,這是該DLL的報頭。 #define MYLIBAPI extern "C" __declspec(dllimport)
表示這裏我們將聲明一些將在專用.cpp文件中描述的函數/變量,並將包含在DLL中。
MyLibFile1.cpp
#include <windows.h>
#define MYLIBAPI extern "C" __declspec(dllexport)
#include "MyLib.h"
int g_nResult;
int Add(int nLeft, int nRight) {
g_nResult = nLeft + nRight;
return(g_nResult);
}
所以,這顯然是在那裏我們的功能實現文件。這是DLL的一部分,對嗎?
MyExeFile1.cpp
#include <windows.h>
#include <strsafe.h>
#include <stdlib.h>
#include "MyLib.h"
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {
int nLeft = 10, nRight = 25;
TCHAR sz[100];
StringCchPrintf(sz, _countof(sz), TEXT("%d + %d = %d"),
nLeft, nRight, Add(nLeft, nRight));
MessageBox(NULL, sz, TEXT("Calculation"), MB_OK);
StringCchPrintf(sz, _countof(sz),
TEXT("The result from the last Add is: %d"), g_nResult);
MessageBox(NULL, sz, TEXT("Last Result"), MB_OK);
return(0);
}
所以,這是我們使用的功能,從庫中的可執行文件。 整件事情都不起作用。我試圖把這一切都放到一個目錄中並立即編譯。我首先嚐試從前兩個模塊(成功)編譯DLL,然後編譯可執行文件(將路徑更改爲頭文件)。然而,它導致了2個錯誤兩次:
錯誤LNK2019:無法解析的外部符號_WinMain @函數___tmainCRTStartup
\ Visual Studio 2008的\項目\ MyExeFile1 \調試\ MyExeFile1.exe引用16:致命錯誤LNK1120:1未解決的外部問題
什麼是正確的方法來做到這一點 - 我應該改變什麼代碼,以及如何編譯代碼(我使用VS2008)? 謝謝。
謝謝..我並不真正瞭解會發生什麼。如果我添加預處理器定義,何時定義BUILDING_DLL?何時定義?它的目的是什麼?我認爲它是這樣的:當DLL沒有編譯時,BUILDING_DLL沒有被定義,所以我們將這些函數導入到DLL中,之後呢? ...(我現在看到我根本不理解dllimport/dllexport部分) – lhj7362 2010-01-16 15:32:38
當您添加預處理器定義時,它被定義爲#defined。你在DLL項目中這樣做,它確保函數被導出。它沒有在任何其他項目中定義,以確保函數被導入。 – 2010-01-16 15:41:09