我來自一個Windows本地開發的視覺工作室背景,我現在要編譯用於android的本地代碼。靜態/動態庫vs .so庫?
我不確定unix類庫(.so?)是如何工作的。它們是靜態的(就像windows上的.lib)或動態加載像DLL一樣? 例如,在Visual Studio中,我將.lib文件添加到我的項目中進行編譯,然後在運行時加載.dll。通過使用GCC,unix-stuff中的等價物是什麼?
謝謝!
我來自一個Windows本地開發的視覺工作室背景,我現在要編譯用於android的本地代碼。靜態/動態庫vs .so庫?
我不確定unix類庫(.so?)是如何工作的。它們是靜態的(就像windows上的.lib)或動態加載像DLL一樣? 例如,在Visual Studio中,我將.lib文件添加到我的項目中進行編譯,然後在運行時加載.dll。通過使用GCC,unix-stuff中的等價物是什麼?
謝謝!
在Linux上,.so文件與Windows上的.dll文件等效(*),因爲它們在執行時被動態加載到可執行文件。但請注意,鏈接應用程序時不需要.lib文件。鏈接器將直接在.so文件中找到信息。
*:有差異。
有什麼區別(顯然格式除外)? – Mehrdad 2011-06-10 16:08:01
我能想到的主要原因是Linux .so文件可能具有未定義的依賴關係。他們將在運行時解決。 (在Windows上,它們需要在鏈接時解決。) – 2011-06-10 16:11:46
此外,Linux .so文件沒有DllEntry函數,該函數在動態庫由可執行文件加載/卸載時調用。 – 2011-06-10 16:12:51
。Linux上的Linux文件的行爲與Windows上的.dll和Mac OSX上的.dylib的行爲相同。
首先,您應該閱讀Static, Shared Dynamic and Loadable Linux Libraries上的一個頁面。
這應該澄清你的幾個問題。該頁面提供了對初學者很好的源代碼示例。
另一個有趣的參考是Writing DLLs for Linux apps。
它們是動態的(共享對象) - http://en.wikipedia.org/wiki/Library_(computing)#Naming。 – MByD 2011-06-10 16:02:59
所以你不需要一個.lib等效的編譯在unix開發中,只需加載動態庫? – KaiserJohaan 2011-06-10 16:05:04
查看Didier的答案 – MByD 2011-06-10 16:07:30