我有一個庫,它在編譯時建立一個名爲libEXAMPLE.so(在so.le文件夾中)的共享對象,以及一個名爲EXAMPLE.so的DLL(在該dll文件夾)。這兩個共享對象的大小非常相似,看起來完全一樣。瀏覽互聯網發現,程序使用dll做符號解析的方式與共享對象的方式可能有所不同。共享對象和DLL之間的區別
你們能幫我理解嗎?
我有一個庫,它在編譯時建立一個名爲libEXAMPLE.so(在so.le文件夾中)的共享對象,以及一個名爲EXAMPLE.so的DLL(在該dll文件夾)。這兩個共享對象的大小非常相似,看起來完全一樣。瀏覽互聯網發現,程序使用dll做符號解析的方式與共享對象的方式可能有所不同。共享對象和DLL之間的區別
你們能幫我理解嗎?
「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
它們真的有什麼不同?可能很高興指出我們的來源!但據我所知,至少在Linux下(並且考慮到你在談論.so文件,你是在linux下的,對吧?),在運行時鏈接的二進制文件使用'ld.so'處理,並且可以由API函數,如'dlopen'。我沒有看到文檔中的共享對象和動態鏈接庫之間的區別。 – Rook
我認爲區別僅在於用於加載動態(共享)庫的不同格式,而不是如何在客戶端中使用導出的類或符號。 –
我聽說過一般的經驗法則,如果你打算在構建時連接一個庫,那麼應該使用.so變體,否則如果你使用dlopen加載它們,那麼應該使用dll變體。 – Falcata