2012-10-18 21 views
19

Xcode'ta bir C++ kitaplığı oluşturmaya çalışıyorum ve C/C++ Kitaplığı veya STL C++ Kitaplığı seçeneğinin seçilip seçilmediğinden emin değilim. STL C++ Library seçeneğinin statik bir kitaplık oluşturmanıza ve dinamik bir kitaplık oluşturmaya zorlamanıza izin vermediğini fark ettim. Ancak, C/C++ Library seçeneği, statik kitaplık oluşturmaya ek olarak bir dinamik kitaplık oluşturmanıza da olanak tanır.XCode'daki C/C++ Kitaplığı ve STL C++ Kitaplığı arasındaki fark nedir?

Bu iki seçenek arasındaki fark nedir ve ne zaman kullanmalıyım? Seçeneklerin altındaki açıklamaları okudum ama maalesef çok yararlı değiller.

Başka bir notta, statik kitaplık dosyası neden dinamik kitaplık dosyasından farklı? Fark, kütüphanenin işleyişinde ya da kodunda değil, kütüphanenin nasıl bulunduğuna (uygulamanızla paketlenmiş olarak hedef makinede varlığına güvenerek) göre görünür. Birisi bunu netleştirebilirse harika olur.

enter image description here

+0

libC++ vs libstdC++ belki? – Praetorian

cevap

17

bir statik bağlantılı kütüphane

enter image description here

çalıştırma sırasında yüklenemez ancak yürütülebilir bağlantı zaman ikili dosya içine dahil edilmelidir. Bu, statik olarak bağlanmış kitaplıktaki koda tüm giriş noktalarının iyi tanımlandığı ve adreslerinin yürütülebilir kodunuzun başlangıcına göre değişmeyeceği anlamına gelir (bu nedenle "statik"). Dinamik olarak yüklenen kitaplıklar ile, kodun nerede olacağını bilmenin bir yolu yoktur, bu nedenle kitaplık çalışma zamanında yüklendiğinde, yüklenen kodu "bağlamak" için belirli bir miktarda performans yükü gereklidir. Esasen, bağlantı, çalışma zamanına ertelenir, bu yüzden bazen "geç bağlama" olarak da bilinir.

Uygulamayı seçtiğiniz, kullanım gereksinimlerinize bağlıdır. Bağımlılıklar hakkında endişelenmenize gerek kalmadan kullanıcının kendi uygulama klasörüne sürükleyip bırakabileceği bağımsız bir yürütülebilir dosya isterseniz, kütüphanelerinizi statik olarak bağlayabilirsiniz.

Ancak daha büyük ölçekli projeler için, bir ton işlevsellik sağlayan uygulamalarda, tüm işlevleri aynı anda yüklemek gereksiz ve gereksiz olabilir. Bir dizi dinamik olarak yüklenebilen kitaplığın sağlanması hem belleği kaydedebilir hem de başlangıç ​​süresini kısaltabilir. Daha sonra, kullanıcı özelliklere eriştikçe, ilgili kod yüklenir ve muhtemelen bir süre kullanılmayan özellikler kaldırılabilir. Ayrıca, kodda değişiklik yaparsanız, tüm yürütülebilir dosyayı yeniden derlemek ve yeniden dağıtmak zorunda kalmadan bir ya da iki kütüphaneyi yeniden dağıtabilirsiniz. Eklentilerden bahsetmek zorundayım mı?

Yukarıdaki iki şablon arasındaki farklar ince. Her ikisi de GNU99 standardına göre derler. Ancak C/C++ Kitaplığı şablonu, C++/GNU ++ 0x "standart" 'a göre C++ derlemek için xcode kurar. C++/GNU ++ 0x daha sonra resmi olarak 2011'de C++/GNU ++ 11 olarak yayınlandı. Her iki şablon da libC++ 'yı kullanmaya başladı, ancak STL C++ Şablonu bunun yerine eski libstdC++' ya karşı bağlantı oluşturmayı seçmenize izin veriyor. Neden bunu yaptın? Kodunuz libC++ 'a karşı bağlantı kurarsa, ancak libstdC++' ye referans veren diğer kitaplıklara da bağlanıyorsanız ve birbiriyle çelişen sembollerle karşılaşıyorsanız, bunun yerine libstdC++ ile bağlantı kurarak bunu çözebilirsiniz. STL C++ Kitaplığı şablonu ayrıca, derleyicinin GNU ++ 11 uzantıları hariç, C++ 11 standardına uymasını veya C++/GNU ++ 98'e geri dönmesini (eski kodu derlemeniz gerekirse, örnek).