2010-05-25 28 views
12

2 sürümlerini kullanarak, gcc 4.1.2 ile gelen ve 1.33'ü destekleyen RHEL 5.3 kullanıyorum. İstediğim bazı özellikler var, bunlar 1.33 desteğinde eksik. Bu nedenle, düşünce, taze boost sürüm 1.43'e yükseltmekti.Eşzamanlı olarak

  1. bu eş zamanlı olarak artırmak 1.43 bazı başlık sadece bir kütüphane (lar) ve 1.33 den kalan kullanmak mümkündür mi? Örneğin, 1.33 desteğinde eksik olan unorded_map kullanmak istiyorum.

  2. Farklı sürümlerden eşzamanlı ikili çoğaltma kütüphaneleri kullanmak mümkün mü? Biraz şansın (ve bakımı çok) ile

cevap

3

Eğer muhtemelen tamamen yeni başlıklarını kullanarak kurtulabilir. Hemen hemen her şey için, aceleyle çirkinleşebilir, çünkü Boost'un bazı bölümleri diğer kısımlara atıfta bulunur, ve 1.33 kodunun bir kısmı 1.43 başlık bağımlılığı için 1.43 başlık yüklerse, gittiğinizde oldukça iyi bir şans vardır. Sonuç olarak bazı problemler almak için - en iyi ihtimalle umduğunuz en iyi şey bu noktada hızlı, temiz bir ölümdür (çarpışma), ancak daha da kötüye gidebilir (örneğin, sessiz veri bozulması).

14

Hayır - asla bunu yapmayın!

Bu imkansız, yanlışlıkla çökmelere neden olacaksınız.

tek yolu ad adlandırma kullanıyor düzgün halletmek için: farklı ad yerleştirilen alternatif boost sürümünü oluşturmak yani.

BCP'nin son sürümü bu seçeneği sunar. Yani, boost_1_43 gibi bir şey yerine destek kullanacaksınız. Ama sizin için oldukça şeffaf olacak. Ancak yine de, aynı cpp dosyasında iki yükseltme sürümünü kullanamayacağınız için 'un farkında olmalısınız.

Ayrıca bu tartışma üzerine bir göz atın: Creating Library with backward compatible ABI that uses Boost

sevdim senaryo, ad alanını yeniden adlandırır tanımlar ve aslında

#include <boost/foo.hpp> 
#include <myboost/bar.hpp> 

boost::foo f; 
myboost::bar b; 

Boost BCP buna izin vermez

gibi boost iki sürümlerini içerebilir böylece içerir .

Ancak bazı kütüphaneler boost öneki olmadan, :: iplik artırmak ve artırmak :: regex en C API (regexec, regcomp) extern "C" sembolleri dışa olarak hala dikkatli olmalıdır

Düzenleme

böyle konunun örnek olarak aşağıdaki dosyaları oluşturun:

a.cpp:

template<typename Foo> 
Foo add(Foo a, Foo b) 
{ 
     return a+b; 
} 


int foo(int x,int y) 
{ 
     return add(x,y); 
} 

b.cpp:

template<typename Foo> 
Foo add(Foo a, Foo b) 
{ 
     return a-b; 
} 


int bar(int x,int y) 
{ 
     return add(x,y); 
} 

testi.cpp:

30 -10 

Ama

30 30 

veya

alırsınız:

g++ a.cpp b.cpp test.cpp 

Sen beklenebilir:

#include <iostream> 

int foo(int,int); 
int bar(int,int); 

int main() 
{ 
     std::cout<< foo(10,20) <<" " <<bar(10,20) << std::endl; 
} 

bunları derlemek

-10 -10 

Bağlantı sırasına bağlı olarak. Farklı derleme birimlerinde yerleştirilirse

Yani yanlışlıkla diğer baskının sembolleri kullanmak ve bu program sembolü int add<int>(int,int) aynı çökebilir iki artırmak sürümlerini kullanan aynı sembole bile çözümlenir.

+0

+1 - cevabınızın ilk yarısına katılmama rağmen. – richj

+0

@richj - tüm bağlantıların açık olduğu DLL platformları altında mümkündür, ancak ELF için kötü şeyler (deneyimden) gerçekleşir – Artyom

1

Güncelleme

benim orijinal cevap bağlayıcı yetenekleri ve kullanılan seçenekler hakkında çok fazla varsayımlar yapar düşünüyorum ve iyi tamamen yanlış olabilir. Normalde onu silecektim, ancak tartışmada diğer cevaplarda yer almayan bazı noktalar var.

Sadece şaşırtıcı bir iyi işlenmiş kapalı kaynak kitaplığı oluşturmak için gerekenleri buluyorum.

Orijinal Cevap sürece kod derleme sırasında oluşturulur ve oluşturulan semboller derleme adımı kapsamında sınırlı olmalıdır çünkü o zaman sorun olmaz derleme adımı başına tek bir sürümünü kullanmak olarak

.

Boost'un hala bağlanabilir kütüphaneleri olmayan bir şablon kitaplığı olduğunu varsayarım. Değilse, kitaplığın birden çok sürümüne bağlanmadığınız sürece hala sorun yok demektir.

Bu konuda yanıltıcı olabilirim, ancak, uygulamanız için tanımlanan sürümden farklı bir Boost sürümüne karşı yerleşik herhangi bir üçüncü taraf kitaplığı kullanamazsınız. Okuduğum ya da duyduğum hiçbir şey, bu sınırlamanın geçerli olduğunu ima etmiyor. Kendi uygulamanızı oluşturuyorsanız, kendi kodunuz için bir Boost sürümüne bağlı kalırdım. RHEL tarafından sağlanan aynı sürüm olmak zorunda değildir.

g++ -c -I/usr/include/boost_1.31 a.cpp 
g++ -c -I/usr/include/boost_1.39 b.cpp 
ar rcs liba.a a.o 
ar rcs libb.a b.o 
g++ -I/usr/include/boost_1.41 test.cpp liba.a libb.a -o test 

... ve bağlıdır çünkü şimdi, Artyom bakış açısını anlamaya:

Güncelleme Artyom adlı örnekle karşılaştırıldığında

, ben bahsediyorum senaryo daha bu gibi linker, sembolleri aynı kütüphane dosyasında tercih eder veya seçmez. Bağlantı için

+0

-1 Doğru değil, özellikle de ELF platformu hakkında konuştuğumuzda, – Artyom

+0

ELF tarafından şunu demek istiyorsunuz: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format? Eğer öyleyse, bunun hakkında hiçbir şey bilmiyorum, ama C++ meta-programlama ile ilgili olduğunu görmüyorum. Lütfen açıkla. – richj

+0

@richj cevabımdaki örneğe bakın. – Artyom

İlgili konular