靜態鏈接庫不能在運行時加載,但必須納入到你的二進制文件,當你鏈接您的可執行文件。這意味着靜態鏈接庫中的代碼的所有入口點都已定義好,並且它們的地址相對於可執行代碼的開頭(即「靜態」)不會改變。
對於動態加載的庫,無法知道代碼將在哪裏,所以當庫在運行時加載時,需要一定的性能開銷來「綁定」加載的代碼。本質上,鏈接被推遲到運行時間,這就是爲什麼它有時也被稱爲「後期綁定」。
您選擇實施哪個取決於您的使用要求。如果你想要一個自包含的可執行文件,用戶可以簡單地拖放到他的應用程序文件夾中,而不必擔心依賴關係,靜態鏈接你的庫可能是一條可行的路。
但是對於規模較大的項目,在提供大量功能的應用程序中,一次加載所有功能可能過於禁止且不必要。提供一組可動態加載的庫可以節省內存並縮短啓動時間。然後,隨着用戶訪問特徵,加載相關的代碼,並且可能卸載可能暫時未被使用的特徵。
此外,如果您對代碼進行了更改,您可能只需重新分配一個或兩個庫,而不必重新編譯並重新鏈接並重新分發整個可執行文件。我需要提到插件的前景嗎?
上述兩個模板之間的差異很微妙。兩者都根據GNU99標準編譯C.但是C/C++庫模板根據C++/GNU ++ 0x「標準」設置xcode來編譯C++。 C++/GNU ++ 0x後來在2011年正式發佈爲C++/GNU ++ 11。這兩個模板默認使用libC++,但STL C++ Template允許您選擇鏈接到較早的libstdC++。你爲什麼要這樣做?如果您的代碼與libC++鏈接,但是您還鏈接到引用libstdC++的其他庫,並且您運行的是衝突符號,則可以通過鏈接到libstdC++來解決此問題。 STL C++庫模板還允許您請求編譯器堅持使用C++ 11標準(不包括GNU ++ 11擴展),或者返回到C++/GNU ++ 98(如果您需要編譯遺留代碼,例)。
libC++ vs libstdC++也許? – Praetorian