2017-07-27 10 views
5

Önsöz

artırmak, bu yüzden gözlerimi yapacağım en iyi. Ben statik kütüphane, libfoo.a olarak derlenmektedir büyük proje ile çalışıyorumözel miras ile hatayı bağlantı ve şu anda bir <a href="https://stackoverflow.com/help/mcve">MCVE</a> içine kıramazlar kod büyük parçasıyla çalışarak


Sorun

. Ayrı bir proje olan bar, bu kitaplığa karşı bağlantılar.

Hem libfoo ve bar
class Base { 
public: 
    void foo(){} 
    void bar(){} 
}; 

class Derived : private Base { 
public: 
    using Base::foo; 
}; 

kapsamlı kullanan şu şekildedir: libfoo yılında "kusurlu" pasajıdır. bar o kullanır nedeniyle C++ 11 özelliklerine -std=c++11 ile derlenmiş olması gerekir, ancak libfoo asgari seçenekleri ile derlenebilir (yani -std=gnu++03 gibi görünen GCC V4.8, kullandığı -std=c++0xvarsayılan derleyici seçenekleri).

Benlibfoo.a derlenmiş bir -std=c++0xGCC varsayılan kullanarak bar bağlantı girişiminde bunun için azaltır uzun, ad-parçalanmış uyarı ile başarısız olduğunda: Ne zaman libfoo.a yeniden inşa

Undefined reference to Base::Derived::foo() 

-std=c++11 ile, bu sorun artık oluşmaz.


Çalışma So Far

Ben aracılığıyla libfoo.a çıktısını karşılaştırmış ve her iki durumda da, uygun semboller hazır bulundu. Ayrıca the Cxx11Abi compatibility documents'u da inceledim ve bu derleyici ayarının uyumluluğunu "bozması" gerektiği görünmüyor. nedeni bu bağlayıcı konunun Ne


Soru

mı?

+0

"Minimum ayarlar" ile ne demek istiyorsun? -std = C++ 11 '' -std = C++ 0x' ile aynı olmalıdır! – user463035818

+0

@ tobi303 Bu şekilde, ek derleyici seçenekleri (yani derleyici tarafından varsayılan ayarlar: GCC v4.8.4). – DevNull

+0

sorunu, ortamın taslak için farklı başlıklar ve yayınlanacak 2011 standart – Swift

cevap

0

MartinBonner'ın belirttiği gibi, işlev prototiplerinde kullanılan türlere ad alanı değişiklikleri ile ilgili olması gerekiyordu. Tek çözüm, -std=c++11 aracılığıyla derlenerek ya da türün etrafında fazladan bir "soyutlama" katmanına sahip olmak için çok miktarda kodun yeniden yazılmasıydı.

+0

Ad alanı değişikliğine bir örnek verebilir misiniz? Bunu yapmak çok daha iyi bir cevap olurdu. –

İlgili konular