2010-01-21 17 views
6

Çok sayıda paylaşılan kütüphaneyi kapsayan oldukça büyük boyutlu bir proje üzerinde çalışıyorum. Ayrıca STL, Boost ve kendi şablon sınıflarımız ve işlevlerimiz üzerinde de büyük güven duyuyoruz. Dışa aktarılan sınıfların çoğu, şablon üyeleri içerir ve dışa aktarılan işlevler şablon parametreleri içerir. Ben Visual Studio (2008 ve 2010 ikisi) derleme yaparkenPaylaşılan Nesne/DLL'deki Templated Sınıflarını ve İşlevlerini Kullanma

#if defined(_MSC_VER) && defined(_DLL) 
    // Microsoft 
    #define EXPORT __declspec(dllexport) 
    #define IMPORT __declspec(dllimport) 
#elif defined(_GCC) 
    // GCC 
    #define EXPORT __attribute__((visibility("default"))) 
    #define IMPORT 
#else 
    // do nothing and hope for the best at link time 
    #define EXPORT 
    #define IMPORT 
#endif 

#ifdef _CORE_COMPILATION 
#define PUBLIC_CORE EXPORT 
#define EXTERNAL_CORE 
#else 
#define PUBLIC_CORE IMPORT 
#define EXTERNAL_CORE extern 
#endif 

#include <deque> 

// force exporting of templates 
EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>; 
EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >; 

class PUBLIC_CORE MyObject 
{ 
private: 
    std::deque<int> m_deque; 
}; 

SO, benim sorun şu ki, şu olsun bu: İşte

ben kütüphane olarak kaydedebilme yapmak nasıl sadeleştirilmiş örnektir uyarı:

uyarı C4251: 'std :: _ Deque_val < _Ty, _Alloc> :: _ Almap' : sınıf 'std :: ayırıcısı < _Ty>' için dll-inter sahip ihtiyacı Yüz sınıfı ait müşterileri 'std :: _ Deque_val < _Ty, _Alloc>' ı var std::allocator<int>, ihraç değil ima etmektedir

tarafından kullanılmak üzere. sınıf 'std :: deque < _Ty>':

uyarı C4251: 'MyObject :: m_deque' Ve bu benim ihracat

EXTERNAL_CORE template class PUBLIC_CORE std::allocator<int>; 
EXTERNAL_CORE template class PUBLIC_CORE std::deque<int, std::allocator<int> >; 

dahil değil, çünkü yanlış gibi değil uyarı verir sınıfın müşterileri tarafından kullanılmak üzere dll-arayüze sahip olması gerekir 'MyObject'

Aklıma gelen tek şey _Ty th hakkında uyarı olduğunu e std::allocator bir şekilde bahsediyor int, ancak bir std::deque<int> mantıksal olarak bir std::allocator<int> tahsis olurdu, aksi takdirde olacağını herhangi bir belirti bulamıyorum.

Tüketici bir uygulama sınıfı iyi kullanabilir, ancak bu uyarının göz ardı edilmemesi gerektiğine dair bir his var. Linux'ta g ++ ile derlerken, herhangi bir hata yayılmaz (bu doğru çalışmadığı anlamına gelmez). G ++ otomatik olarak MSVC'nin yapamadığı bir şey yapıyor mu? Linux'ta GCC'yi, OSX'te LLVM'yi ve Windows'ta MSVC'yi hedefledim, ancak Windows geliştirme için potansiyel olarak MinGW'ye geçebilirim, bu yüzden MSVC'yi terk etmek tam olarak bu sorunun dışında değildir (eğer bu bir rahatsızlıktan dolayı çok büyükse) .

+1

_very_ bu uyarıları yorumlamayı denemeniz iyi! – xtofl

+0

Bu, http://stackoverflow.com/q/5661738/417197 bir kopyası mı (ya da benzer)? –

cevap

3

Bildiğiniz gibi, dışa aktarma dosyanızdaki şablonlar aslında derleyici için 'gerekli gördüğünüz her şeyi doldurma iznidir'. Eğer derleyici A ile başlık dosyasını derlemek, eğer biri için, bazı üyelerin sırası değişebilir derleyici B'den daha deque<int> bambaşka örneğini veya bazı üye değişkenlerinin hatta gerçek tip anlamına gelir

.

Ayrıca derleyici sizi uyarıyor.

DÜZENLEME: Aynı derleyici tarafından derlenmiş zaman

Yani paylaşılan kütüphaneler sadece güzel birlikte çalışacak açıklama bunun neticesini addes.Birlikte çalışmasını istiyorsanız, tüm istemci kodlarının aynı bildirimi (aynı stl uygulamasını kullanarak) gördüklerinden emin olabilirsiniz veya API'nize şablon eklemekten geri adım atabilirsiniz.

+1

+1: Sadece aynı derleyici değil aynı derleyicinin aynı sürümü. VS 2008 ve VS 2008 SP1'in, örneğin, STL tiplerinin farklı uygulamaları ve uygulamaları olabilir. –

+0

Ben izlenim olduğunu 'EXTERNAL_CORE şablon sınıfı PUBLIC_CORE std :: deque gibi ifadeler >;' yoluyla, std :: deque orijinal derleyici'nın uygulanmasını kullanmak için bir tüketici derleme derleyiciler zorlamak için yaratılmışız __dllimport. Kaplar gerçekten sorunum olan tek şeydir (çünkü karmaşık olmayan şeylerin ihracatı iyi çalışıyor gibi görünmektedir). –

+0

@Travis: Bir hedef derleyici, örneğin std :: deque uygulamasının orijinal uygulamasının ne olduğunu nasıl bilir? –

İlgili konular