2010-05-27 83 views
2

爲什麼在編譯時鏈接庫加載失敗?我不在乎釋放圖書館,但它不會工作。動態庫在執行時鏈接

#include <windows.h> 

    int main() 
    { 
     LoadLibrary("winmm.lib"); 
     timeGetTime(); 
    } 
+0

「不起作用」不是對問題非常有幫助的描述。請解釋*什麼*沒有工作,你嘗試過什麼,以及顯示哪些錯誤消息(如果有的話)。 – greyfade 2010-05-27 05:54:36

+0

我得到一個錯誤,說「錯誤LNK2019:無法解析的外部符號__imp__timeGetTime @ 0在函數_main中引用」 – 2010-05-27 06:08:05

+0

錯誤消息不會告訴你LoadLibrary是造成這個問題,因此你的問題是不適合atm。 – YeenFei 2010-05-27 07:02:44

回答

3

.lib不是動態鏈接庫(DLL),並且不能在運行時加載。您需要加載.dll,或在鏈接時鏈接.lib(此時您不使用LoadLibrary)。

+0

我試過'LoadLibrary(「winmm.dll」);'但它不會工作。 – 2010-05-27 05:44:52

2

從上面的註釋可以看出,問題在於timeGetTime()在編譯時需要winmm模塊,這意味着您必須鏈接到winmm.lib。如果要使用運行時鏈接,則不能直接通過其名稱調用該函數;你必須從DLL中取出它的函數指針。

如果您真的想在運行時加載DLL,則必須使用GetProcAddress。在MSDN page上找到了一套正確使用LoadLibrary的示例代碼。

3

試試看看這個代碼。它應該解決你的問題。

#include <windows.h> 

#pragma comment(lib, "winmm.lib") 

int main() 
{ 
    DWORD time = timeGetTime(); 
} 
+0

雖然它不是「便攜式」,但我喜歡將鏈接信息和編譯信息緊密結合在一起的想法。 – xtofl 2010-05-27 06:49:40

1

你要加載使用LoadLibrary功能,其目的是加載動態鏈接庫一的.lib文件(鏈接庫信息) - 這是完全錯誤的。 .lib文件在鏈接時鏈接到可執行文件中,而.dll文件在運行時加載,可以通過使用LoadLibrary的顯式加載或通過向鏈接器提供引用.dll文件的.lib文件。

  • 如果你想加載一個靜態庫,你需要告訴鏈接器包含它 - 請參考你的編譯器的文檔。
  • 要使用.lib文件加載動態庫,您需要執行與靜態庫相同的操作,並將動態庫置於全局PATH或與可執行文件相同的目錄中。
  • 要在運行時加載動態庫,您需要調用LoadLibrary以獲取它的句柄並將其傳遞給GetProcAddress以獲取指向您感興趣的函數的指針。Wikipedia has a small example on how to do this