2011-01-16 12 views
7

vs:Bağlama: Statik ben 3 büyük parçalar var Benim uygulamada Dinamik

  • Exe: yürütülebilir bir dosya
  • Lib_A: Bir kütüphane içeren bir tekil sınıf ve bazı hesaplamalar kullanım olabilmesi için bir temel sınıf singleton sınıf Lib_B
  • : kütüphane Lib_A

Lib_B olduğu I türetilmiş sınıfları nedeni, bazdan türetilen bir takım sınıfları içerir istediğim Exe'den çalışma zamanında Lib_B'yi derlemek. Tüm sistemi sonlandırmadan hesaplamalar sırasında türetilmiş sınıflar oluşturmam gerekiyor. Bu benim için çok önemli. Bu, başlangıçta Lib_B1'in dinamik olarak yüklenmiş olduğunu söyleyebilirim, ayrıca Lib_B2'nin diğer sürümlerini Lib_B2, Lib_B3, Lib_B4 gibi derleyebilir ve dinamik olarak yükleyebilirim. Tüm Lib_Bx kitaplıkları, sınıfları bunlara vermek için giriş noktası işlevlerine sahip olacaktır.

Yani hesaba aşağıdaki gerçekleri alarak: Çalışma zamanında

  • aynı Lib_A paylaşım dosyaları çeşitli sayıda olacaktır.
  • Uygulama Windows ve Linux'ta çalışmalıdır. Yani kısmi çapraz platformluluk bir sorundur.
  • Ben tbb.dll vb gibi kendi arşivlerine sahip olabilen TBB, Boost, Qt gibi bazı kütüphaneler kullanmak için gidiyorum statik veya dinamik hem Exe karşı Lib_A ait bağlamanın avantajları ve dezavantajları nelerdir

ve Lib_Bx'in? Performans, sistem büyüklüğü vs. nasıl etkilenebilir? Her işletim sistemi için kodlama yapabileceğim herhangi bir tehlikeli veya zor durum var mı? Exe, Lib_A ve Lib_Bx'ler için aynı derleyiciyi kullanmam gerekiyor.

Tüm sistemin tasarımı benim için çok zor bir sorundur, bu nedenle herhangi bir yorum takdir edilecektir.

Çok teşekkürler.

cevap

6

, dinamik Lib_A bağlantı oluşturulmalıdır: Eğer Lib_Bx paylaşılan kütüphanelerin her birine statik olarak Lib_A bağlantı varsa, x kez Lib_A kodu ve statik değişkenleri iki katına çıkarır.

Söyle, form var Lib_A bir sınıf varsa:

class BaseKlass 
{ 
    static int instance_count; 
    ... 
}; 

instance_count böylece imkansız onun örneklerini saymak için BaseKlass için yapmak, bütün paylaşılan kitaplıklarında çoğaltılır.

Muhtemelen Ne bahsettiğimde şeyle ilgili sorunları açıklanır bu boost.python document bir göz olmalıdır vb daha ince sanal tablolarla sorunları veya RTTI (dynamic_cast),

tarafından ısırıldı mümkündür.

Boost.python, aynı işlemde yüklenecek olan python modülleri (dinamik kitaplıklar) oluşturulmasına izin verir. Boost.python ile oluşturulan her bir python modülü, eğer bir başka modülde bir A sınıfından bir modülde bir B sınıfını türetmek gibi C++ seviyesinde birlikte iletişim kuracaklarsa, problemleri önlemek için boost.python lib ile dinamik olarak bağlantı kurmaları beklenir.

3

Statik bağlamanın büyük avantajı, bir sürü DLL dosyası göndermeniz gerekmediğidir. Çıplak bir yürütülebilir dosyayı göndermeyi planlamadığınız sürece, bunun bir sorun olmadığını düşünüyorum.

Dinamik bağlantıların bazı büyük avantajları vardır. Her değişiklik yaptığınızda, yalnızca değiştirilmiş DLL'leri yeniden derlemeniz gerekmez. Güncelleştirilmiş dll'leri ABI uyumlu olduğu sürece uygulamanın geri kalanından ayrı olarak dağıtabilirsiniz.

Aynı derleyiciyi Windows ve Linux'ta kullanmak daha basit olabilir, ancak kesinlikle aynı derleyiciyi kullanmanız gerekmez.

Taşınabilir kitaplıklara bağlı kaldığınız sürece, Windows ve Linux arasındaki en büyük fark genellikle yapı sistemidir. Bazı geliştiriciler tamamen ayrı yapı sistemleri korur, ancak cmake gibi birçok çapraz platform inşa sistemi vardır.

+0

Linux'ta Windows ve Intel C++ derleyicilerinde MSVC++ derleyicisini kullanmak istiyorum. Bence her ikisi de GCC'den daha iyi optimize edilmiş kodlar üretiyor. Uygulama sadece benim kullanım içindir. Onu satmak istemiyorum. –

+0

@sad_man: Ve VC ve ICC için yeniden dağıtım hakları almayı planlıyorsunuz? Bununla iyi şanslar. – ephemient

+0

@ephermient: Uygulamamı şimdilik şüphe etmiyorum. Ama eğer ileride satarsam, müşteri açıkça kendi derleyicisinin bir kopyasını sağlayacaktır. Biliyorum iyi gelmiyor ama bu derlenmiş ikili kodun hızını elde etmek için bir hiledir. Şimdilik VC ve ICC ile iyiyim. En kötü durumda uygulamayı GCC ile dağıtabilirim? :) –

2

Yeni sınıflar çalışma zamanı oluşturmak ister misiniz? C++ bunun gibi çalışmak anlamına gelmez. C++ sınıfları statiktir ve hepsi derleme zamanı olmalıdır. Paylaşılan, dinamik olarak yüklenebilen kitaplıklar sorunu çözmek için tasarlanmamıştır.

En basit çözüm, dinamik türlere (örneğin, Lua gibi) sahip bir dilin yorumlayıcısını yerleştirmek ve çalışma zamanı dinamik nesnelerini içine yazmak olabilir.

Gerçekten de çalışma zamanı derlenmiş modülleriyle platform bağımsız bir şekilde etkileşimde bulunmak istiyorsanız, CORBA gibi bazı dil nötr ve platform nötr arabirimini kullanmanız daha iyi olur. Daha sonra, Linux kutunuzda derlenmiş ve çalıştırılan şeyler ile Windows kutusunun hepsi birbiriyle etkileşime girebilir ve çete üyeliği için yeni üyeleri derleyebilir. Ben proje tanımının anladığım

+0

Ama sonra C++ 'nın hız ve esnekliğinden yararlanamıyorum. –

+0

Herhangi bir uygulamanın hızı, öncelikli olarak geliştiricilerin yüksek becerilerinden gelir.Kullanıcı giriş çalışma zamanından oluşturulan kodun verimli olması beklenmemelidir, ancak prototipleme gibi verimliliğin gerekli olmadığı durumlarda yararlı olabilir. Bu yüzden bazı script yorumlayıcılarını kullanmamı önerdim. –

+0

Evet Kullanıcı giriş çalışma zamanı tarafından üretilen kodun verimli olması beklenmemelidir. BUT Kullanıcı giriş çalışma zamanından derlenen ikili kod çok daha hızlı bir kod yorumlayıcısından gelen kod olmalıdır. –

0

Prensipte bunların hepsi de üçü DLL ise, derleyiciyi uygulamanızdan tetikleyebilir ve sonra da yeni DLL'yi dinamik olarak yükleyebilirsiniz. Bu gerçekten diğer herhangi bir eklenti mimarisi gibi (eklentileri olmak için Lib_Bx DLL dosyalarını düşünün).

Bunun akılcı bir yaklaşım olup olmadığını sorguluyorum. Çözümünüz için bir C++ derleyicisinin tam esnekliğine ihtiyacınız var mı? Sorunu çözmenin farklı yollarını buldunuz mu? Sayısal işlem yapıyorsanız OpenCL gibi bir şey daha iyi bir yaklaşım olabilir mi?

İlgili konular