比方說,我更改了共享庫並重新編譯了它。
我是否必須重新鏈接使用該共享庫的所有主要應用程序(以防使用該共享庫時使用隱式鏈接 - #include "myLib.h"
)或在這些應用程序加載時自動完成重新鏈接?重新鏈接使用隱式鏈接更新共享庫的應用程序?
回答
只有當庫的Application Binary Interface (ABI)與以前的版本不兼容時纔會重新編譯 - 如果某些公用函數被刪除或簽名被更改,某些結構的大小發生更改,虛擬函數順序發生更改以及一些其他情況。
否則,您不需要重新鏈接 - 這是使用shared libraries的主要優點之一,允許在不分發新版本應用程序的情況下分發新版本。
您不應該重新鏈接。共享庫在程序啓動時自動鏈接。不要認爲它是「重新」鏈接,它們並沒有在物理上聯繫在一起。
當我最初構建主應用程序時,我打算使用隱式鏈接的共享庫是否必須存在?在這種情況下,編譯和鏈接使用共享庫的主應用程序的命令是什麼樣的? 'g ++ myprog.cpp -o myapp -lmySharedLib.so -ldl'?謝謝 – 2010-12-11 18:00:19
您應該只使用庫的核心名稱進行鏈接。例如。你的'-ldl'實際上鍊接到'libdl.so'(如果找不到'libdl.a')。所以'g ++ myprog.cpp -o myapp -lmySharedLib -ldl' – 2010-12-11 18:24:32
鏈接器需要指定庫。可執行文件需要設置爲在啓動時加載共享庫。另外,鏈接器不能在沒有訪問庫的情況下報告缺失的符號。 – 2010-12-11 19:31:53
- 1. 共享應用程序鏈接,iphone
- 2. 更新共享點字段鏈接
- 3. 鏈接共享庫
- 4. 如何通過消息共享應用程序共享應用程序鏈接
- 5. 與共享庫和應用程序的CRT鏈接
- 6. 將共享庫鏈接到共享庫
- 7. 使用與其他共享庫鏈接的共享庫
- 8. gcc的鏈接共享庫
- 9. 共享庫神祕不鏈接到應用程序
- 10. 將共享庫重新鏈接到不同版本的libc
- 11. Android應用程序鏈接共享使用Facebook請求
- 12. 在phonegap應用程序中不使用插件共享鏈接
- 13. AppStore中應用程序更新版本的直接鏈接
- 14. 鏈接到linux共享庫
- 15. 與共享庫鏈接
- 16. Android.mk:共享庫未鏈接
- 17. 鏈接到共享庫Linux
- 18. 共享數據庫鏈接
- 19. 如何使用其他應用程序從應用程序共享鏈接
- 20. Facebook共享鏈接時分享鏈接
- 21. 更改鏈接到共享庫
- 22. 更新表與鏈接到共享點的訪問鏈接的SQL Server
- 23. 如何在tomcat中運行應用程序時重新鏈接鏈接錯誤?
- 24. 從iOS應用程式共享一個在Tumblr上的鏈接
- 25. 如何用額外的目標文件重新鏈接現有的共享庫
- 26. 通過應用程序共享發佈到牆上的鏈接
- 27. Facebook的 - 應用程序共享鏈接無法正常運行
- 28. 通過我的應用程序Android共享鏈接和圖像
- 29. 從我的應用程序沒有共享鏈接
- 30. 對鏈接共享庫,調用程序沒有定製LD_LIBRARY_PATH
必須存在共享庫(如果我打算使用它與隱式鏈接),當我鏈接主應用程序,或者我只需要知道它的名稱?例如,在'G ++ myprog.cpp -o MYAPP -lmySharedLib'我在這裏連接'myapp'到'libmySharedLib.so',但連接'myapp'時共享庫必須存在,否則就足夠了鏈接器只知道它的名稱和後來,當'myapp'加載它搜索共享庫來解決任何未解決的引用?謝謝您的幫助。 – 2010-12-12 15:48:40
@kobac我認爲它已經存在,即使共享庫的代碼沒有鏈接到應用程序二進制文件中,鏈接器仍然會執行一些檢查。 – 2010-12-12 18:09:33
如果您的ABI變得不兼容,您應該更改庫的名稱 - 否則一切都會中斷。您可以將函數和項添加到您自己分配的結構的末尾而不破壞兼容性。 – 2010-12-13 13:41:06