簡體   English   中英

XCode中的C / C ++庫和STL C ++庫有什么區別?

[英]What's the difference between C/C++ Library and STL C++ Library in XCode?

我正在嘗試在Xcode中創建一個C ++庫,我不確定是選擇C / C ++庫還是STL C ++庫選項? 我注意到STL C++ Library選項不允許您創建靜態庫並強制您創建動態庫。 但是,除了創建靜態庫之外, C/C++ Library選項還允許您創建動態庫。

這兩個選項之間的區別是什么?我應該在何時使用它們? 我閱讀了選項下面的描述,但不幸的是它們並沒有非常有用。

另外,為什么靜態庫文件與動態庫文件完全不同? 似乎差異主要在於如何找到庫(與您的應用程序一起打包而不是依賴於目標計算機上的狀態),而不是在庫本身的功能或代碼中。 如果有人能澄清這一點,那就太棒了。

在此輸入圖像描述

在此輸入圖像描述

靜態鏈接庫無法在運行時加載,但必須在鏈接可執行文件時合並到二進制文件中。 這意味着靜態鏈接庫中代碼的所有入口點都已明確定義,並且它們的地址相對於可執行代碼的開頭不會發生變化(因此“靜態”)。

使用動態加載的庫,無法知道代碼的位置,因此在運行時加載庫時,需要一定的性能開銷來“綁定”加載的代碼。 從本質上講,鏈接被推遲到運行時,這就是為什么它有時也被稱為“后期綁定”。

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

但對於規模較大的項目,在提供大量功能的應用程序中,一次加載所有功能可能過於龐大而且沒有必要。 提供一組可動態加載的庫既可以節省內存,又可以縮短啟動時間。 然后,當用戶訪問特征時,加載相關代碼,並且可能卸載可能暫時未使用的特征。

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

上面兩個模板之間的差異很微妙。 兩者都根據GNU99標准編譯C. 但是C / C ++庫模板根據C ++ / GNU ++ 0x“標准”設置xcode來編譯C ++。 C ++ / GNU ++ 0x后來在2​​011年正式發布為C ++ / GNU ++ 11.兩個模板默認使用libc ++,但STL C ++模板允許您選擇鏈接舊的libstdc ++。 你為什么要這樣做? 如果您的代碼鏈接到libc ++,但您也鏈接到引用libstdc ++的其他庫,並且您遇到沖突符號,則可以通過鏈接libstdc ++來解決此問題。 STL C ++庫模板還允許您請求編譯器遵循C ++ 11標准,不包括GNU ++ 11擴展,或者返回到C ++ / GNU ++ 98(如果您需要編譯遺留代碼,例)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM