2011-02-12 74 views
2

在Windows中,許多.dll都帶有一個靜態的.lib副本。我的理解是,.lib對手基本上包含LoadProcAddress調用,因此程序員不必自己做。本質上,節省時間。當我切換到Linux時,我認爲情況是一樣的,以.so和.lib替換.d與.a替換爲.a,但我遇到了一種情況,顯示我這是錯誤的,我無法弄清楚什麼正在進行中:在編譯時鏈接到共享對象

我正在使用作爲.a/.so對出現的庫。我正在連接.a,但是當我在生成的二進制文件上執行ldd時,它不包含對應的.so文件的引用。那麼,我試着鏈接.so文件,令我驚訝的是,這工作。另外,當我對生成的二進制文件執行ldd時,.so文件出現了。

所以,我真的很困惑,到底發生了什麼。在Windows中,我絕不會想到與.dll文件鏈接。另外,在Windows中,如果一個.dll文件伴隨着一個.lib文件,並且我在編譯時與.lib鏈接,那麼我希望在運行時對相應的.dll具有依賴性。這兩種情況在這種情況下都是不正確的。

是的,我已經閱讀了關於Linux中共享對象的基本教程,但是我讀的所有內容似乎都表明我最初的假設是正確的。順便說一下,我應該提及我使用Code :: Blocks作爲IDE,但我知道它使事情變得複雜,但我確信當我告訴它與.so文件鏈接時,它不僅僅是交換.a文件,因爲生成的二進制文件較小。 (加上關於LDD的整個業務...)

無論如何,在此先感謝。

回答

1

我正在鏈接到.a,但是當我在生成的二進制文件上執行ldd時,它不包含對應的.so文件的引用。

這是預期的。靜態鏈接時,靜態庫的代碼將集成到生成的二進制文件中。沒有更多對靜態庫的引用或依賴關係。

那麼,我試着鏈接到.so文件,令我驚訝的是,這工作。

你是什麼意思,靜態鏈接不起作用?沒有理由不應該...

+0

不,我很驚訝你可以鏈接一個動態庫。你不能在Windows中鏈接一個DLL。 – Joey 2018-03-10 22:28:47

1

.lib在Windows中用於動態鏈接。你在Linux中沒有它們,你直接與.so鏈接。 .a文件是靜態構建的庫,您可以使用它來靜態鏈接。

+0

正確,但在很多情況下,.lib和.dll在Windows中配對在一起。 .lib是一個小的存根庫,它包含從.dll(即LoadProcAddress)加載實際函數的包裝函數。我試圖瞭解這是如何在Linux中的作品。我認爲答案是,當你鏈接到.so文件時,你正在做類似的事情,但可能是錯誤的。 – Joey 2018-03-10 22:25:39

0

要添加到tharibo已經正確的答案 - 在某些情況下(例如延遲共享庫加載),可能需要以Windows方式進行,即通過鏈接靜態存根而不是.so。這些存根可以通過手工編寫,由項目特定的腳本或通用的Implib.so tool生成。