2010-12-11 81 views

回答

1

只有當庫的Application Binary Interface (ABI)與以前的版本不兼容時纔會重新編譯 - 如果某些公用函數被刪除或簽名被更改,某些結構的大小發生更改,虛擬函數順序發生更改以及一些其他情況。

否則,您不需要重新鏈接 - 這是使用shared libraries的主要優點之一,允許在不分發新版本應用程序的情況下分發新版本。

+0

必須存在共享庫(如果我打算使用它與隱式鏈接),當我鏈接主應用程序,或者我只需要知道它的名稱?例如,在'G ++ myprog.cpp -o MYAPP -lmySharedLib'我在這裏連接'myapp'到'libmySharedLib.so',但連接'myapp'時共享庫必須存在,否則就足夠了鏈接器只知道它的名稱和後來,當'myapp'加載它搜索共享庫來解決任何未解決的引用?謝謝您的幫助。 – 2010-12-12 15:48:40

+0

@kobac我認爲它已經存在,即使共享庫的代碼沒有鏈接到應用程序二進制文件中,鏈接器仍然會執行一些檢查。 – 2010-12-12 18:09:33

+0

如果您的ABI變得不兼容,您應該更改庫的名稱 - 否則一切都會中斷。您可以將函數和項添加到您自己分配的結構的末尾而不破壞兼容性。 – 2010-12-13 13:41:06

1

您不應該重新鏈接。共享庫在程序啓動時自動鏈接。不要認爲它是「重新」鏈接,它們並沒有在物理上聯繫在一起。

+0

當我最初構建主應用程序時,我打算使用隱式鏈接的共享庫是否必須存在?在這種情況下,編譯和鏈接使用共享庫的主應用程序的命令是什麼樣的? 'g ++ myprog.cpp -o myapp -lmySharedLib.so -ldl'?謝謝 – 2010-12-11 18:00:19

+0

您應該只使用庫的核心名稱進行鏈接。例如。你的'-ldl'實際上鍊接到'libdl.so'(如果找不到'libdl.a')。所以'g ++ myprog.cpp -o myapp -lmySharedLib -ldl' – 2010-12-11 18:24:32

+0

鏈接器需要指定庫。可執行文件需要設置爲在啓動時加載共享庫。另外,鏈接器不能在沒有訪問庫的情況下報告缺失的符號。 – 2010-12-11 19:31:53