2012-11-07 169 views
3

在Visual Studio 2010我建立項目作爲動態庫(說dyn1.dll)這是使用另一個DLL(說dyn2.lib,dyn2.dll,dyn2.h是各自文件)。我直接在我的項目中包含dyn2.h和dyn2.lib。並設置「路徑」變量指向dyn2.dll所在的位置。這是我遵循的使dyn1.dll工作的過程。靜態和動態庫鏈接在Visual Studio C++

現在說我建立我的項目作爲靜態庫(說sta1.lib),同時仍然使用dyn2.dll,dyn2.h和dyn2.lib。是包含在sta1.lib內的dyn2.lib,dyn2.dll中包含的所有代碼。

意思是sta.lib standalone。我不需要指向sta1.lib的路徑變量中的dyn2.dll的目錄嗎?我是新來的這些所謂澄清的答案將是非常有益

感謝

回答

3

簡單的答案是沒有。來自dyn2.dll的代碼是而不是包含在您的靜態dyn1.lib(sta1.lib)中。事實上,你將不得不將dyn2.lib與任何現在使用你的靜態sta1.lib的項目鏈接起來,否則你將會有未解決的鏈接器錯誤。

這並不是說你的靜態庫不是在dyn2.dll中引用代碼;它是。但作爲一個靜態庫,沒有PE模塊。它只是一個帶有外部引用的.obj代碼模塊的集合。這些外部引用(對dyn2.dll)仍需要由靜態庫中的代碼來解決,而這些代碼又使用對dyn2.dll的代碼引用。靜態庫沒有「鏈接時間」分辨率。只有當你連接你的最終PE(無論是DLL還是EXE)時纔會發生。事情仍然需要在最後的鏈接中修復。

因此,要回答你的第二個問題。在或者大小寫(靜態或動態)的情況下,最終的可執行文件仍然需要對dyn2.dll進行加載訪問,無論它在哪裏。此外,它現在還必須與dyn2.dll導入庫(dyn2.lib)鏈接,就像您的dyn1.dll必須先前一樣。