2012-11-08 44 views
4

我有一個庫,它在編譯時建立一個名爲libEXAMPLE.so(在so.le文件夾中)的共享對象,以及一個名爲EXAMPLE.so的DLL(在該dll文件夾)。這兩個共享對象的大小非常相似,看起來完全一樣。瀏覽互聯網發現,程序使用dll做符號解析的方式與共享對象的方式可能有所不同。共享對象和DLL之間的區別

你們能幫我理解嗎?

+0

它們真的有什麼不同?可能很高興指出我們的來源!但據我所知,至少在Linux下(並且考慮到你在談論.so文件,你是在linux下的,對吧?),在運行時鏈接的二進制文件使用'ld.so'處理,並且可以由API函數,如'dlopen'。我沒有看到文檔中的共享對象和動態鏈接庫之間的區別。 – Rook

+0

我認爲區別僅在於用於加載動態(共享)庫的不同格式,而不是如何在客戶端中使用導出的類或符號。 –

+0

我聽說過一般的經驗法則,如果你打算在構建時連接一個庫,那麼應該使用.so變體,否則如果你使用dlopen加載它們,那麼應該使用dll變體。 – Falcata

回答

5

「DLL」是windows怎麼樣來命名他們的動態庫

「SO」是Linux如何喜歡來命名他們的動態庫

兩者有異曲同工之妙:動態加載。

Windows使用PE二進制格式,而linux使用ELF。

PE: http://en.wikipedia.org/wiki/Portable_Executable

ELF: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

+0

我在(so文件夾)和LIBRARY-NAME.so(在dll文件夾中)找到了libLIBRARY-NAME.so。兩者有什麼區別? – Falcata

+1

@Falcata你在編譯哪個主機系統?除非您正在交叉編譯,否則編譯器不太可能在linux/unix環境下生成.dll文件。也許這只是庫構建系統的一個缺陷,你完全可以在dll文件夾中看到結果。 –

+0

我正在使用QNX來定位多個平臺(ARM等)。 – Falcata