2012-10-18 103 views
19

我想在Xcode中創建一個C++庫,我不確定是否選擇C/C++庫或STL C++庫選項?我注意到STL C++ Library選項不允許你創建一個靜態庫並強制你創建一個動態庫。但是,除了創建靜態庫之外,C/C++ Library選項還允許您創建動態庫。XCode中的C/C++庫和STL C++庫有什麼區別?

這兩個選項之間有什麼區別,我應該什麼時候使用每個選項?我閱讀下面的選項的說明,但不幸的是,他們並不是非常有幫助。

另一個說明,爲什麼靜態庫文件根本不同於動態庫文件?看起來不同之處主要在於如何找到庫(與您的應用程序一起打包,還是依賴目標機器上的存在),而不是庫的功能或代碼本身。如果有人能夠澄清這一點,這將是非常棒的。

enter image description here

enter image description here

+0

libC++ vs libstdC++也許? – Praetorian

回答

17

靜態鏈接庫不能在運行時加載,但必須納入到你的二進制文件,當你鏈接您的可執行文件。這意味着靜態鏈接庫中的代碼的所有入口點都已定義好,並且它們的地址相對於可執行代碼的開頭(即「靜態」)不會改變。

對於動態加載的庫,無法知道代碼將在哪裏,所以當庫在運行時加載時,需要一定的性能開銷來「綁定」加載的代碼。本質上,鏈接被推遲到運行時間,這就是爲什麼它有時也被稱爲「後期綁定」。

您選擇實施哪個取決於您的使用要求。如果你想要一個自包含的可執行文件,用戶可以簡單地拖放到他的應用程序文件夾中,而不必擔心依賴關係,靜態鏈接你的庫可能是一條可行的路。

但是對於規模較大的項目,在提供大量功能的應用程序中,一次加載所有功能可能過於禁止且不必要。提供一組可動態加載的庫可以節省內存並縮短啓動時間。然後,隨着用戶訪問特徵,加載相關的代碼,並且可能卸載可能暫時未被使用的特徵。

此外,如果您對代碼進行了更改,您可能只需重新分配一個或兩個庫,而不必重新編譯並重新鏈接並重新分發整個可執行文件。我需要提到插件的前景嗎?

上述兩個模板之間的差異很微妙。兩者都根據GNU99標準編譯C.但是C/C++庫模板根據C++/GNU ++ 0x「標準」設置xcode來編譯C++。 C++/GNU ++ 0x後來在2​​011年正式發佈爲C++/GNU ++ 11。這兩個模板默認使用libC++,但STL C++ Template允許您選擇鏈接到較早的libstdC++。你爲什麼要這樣做?如果您的代碼與libC++鏈接,但是您還鏈接到引用libstdC++的其他庫,並且您運行的是衝突符號,則可以通過鏈接到libstdC++來解決此問題。 STL C++庫模板還允許您請求編譯器堅持使用C++ 11標準(不包括GNU ++ 11擴展),或者返回到C++/GNU ++ 98(如果您需要編譯遺留代碼,例)。

相關問題