2009-08-07 109 views
14

假設我有一個靜態C++庫,static.lib,我想從C++共享庫中調用一些函數,比如shared.lib。可能嗎?C++靜態庫可以鏈接到共享庫嗎?

現在假設我有另一個共享庫,稱爲shared2.lib,它鏈接到static.lib但不鏈接到shared.lib。在這種情況下,鏈接器是否自動將shared2.lib鏈接到shared.lib?

我使用Microsoft Visual Studio 2003

回答

22

靜態庫未鏈接。它們只是一個目標文件(* .obj或* .o)的集合,它們一起歸檔成一個庫文件(有點像tar/zip文件),以便連接器更容易找到它需要的符號。

靜態庫可以調用未定義的函數(但只在頭文件中聲明),因爲它只被編譯。然後,當您鏈接使用靜態庫的exe或dll時,您將不得不鏈接到另一個庫,該庫提供從靜態庫中調用但未在其中定義的庫。

如果你想鏈接器自動鏈接其他庫斯蒂芬的建議將工作,並由像聲明和stlport非常有信譽的庫使用。爲此,將該編譯指示置於靜態庫的主頭文件中。您應該包含靜態庫及其依賴項。

但是,IMO此功能實際上是爲圖書館編寫者,其中庫在系統庫路徑中,因此鏈接器將很容易找到它。同樣在boost和stlport的情況下,他們使用此功能來支持使用#define定義的選項的多個版本的相同庫,其中不同版本需要不同版本的庫進行鏈接。這意味着用戶不太可能通過一種方式配置提升並與另一個配置的庫鏈接。

我對應用程序代碼的偏好是明確鏈接所需的部分。

0

說我有一個靜態的C++的lib, static.lib我想從C++共享庫調用一些 功能,說 shared.lib。可能嗎?

是的,例如,當你從靜態庫中調用windows函數時,它們通常來自一些動態庫,所以應該沒有區別。

現在假設我有另一個共享 lib下,說shared2.lib可鏈接到 static.lib但不鏈接到 shared.lib。在這種情況下,鏈接器 是否自動將shared2.lib鏈接到 shared.lib?

這樣一個有依賴關係後可能導致的問題,我建議你,而不是使用動態加載LoadLibrary()庫,這樣你就不需要保持這種依賴的軌道在編譯/鏈接。

+0

我同意你應該小心圖書館的依賴,但我認爲在這種情況下LoadLibrary是矯枉過正。我只需要它插件類型的體系結構。 – iain 2009-08-07 05:58:00