2010-06-22 34 views
16

Genel değişkenleri bir DLL'den dışa aktarmaya çalışıyorum.Genel değişkenleri DLL'den dışa aktarma

Foo.h

class Foo 
{ 
public: 
    Foo() 
    {} 
}; 

#ifdef PROJECT_EXPORTS 
    #define API __declspec(dllexport) 
#else 
    #define API __declspec(dllimport) 
#endif 

API const Foo foo; 

foo.cpp

#include "Foo.h" 

const Foo foo; 

Yukarıdaki Kodu derlemek, Visual Studio yakınır:

foo.cpp (3): Hata C2370: ' foo ': yeniden tanımlama; farklı depolama sınıfı 1> foo.h (14): Ben kullanırsanız 'foo'

bildirimi Bkz:

external const Foo foo; 

Foo.h içinde derleyici mutlu ama sonra DLL ihraç etmez sembolü. Fonksiyonları problemlerle dışa aktarmayı başardım ancak değişkenler aynı şekilde çalışmıyor gibi görünüyor ... Herhangi bir fikir mi? senin başlığında

+1

Neden -1? Lütfen reddedilmenizi haklı çıkarın. – Gili

cevap

24

:

API extern const Foo foo; 

kaynak dosyasında: Eğer extern anahtar kelime yoksa, C derleyicisi varsayar

API const Foo foo; 

bir yerel değişkeni bildirmek için yani. (Tanımın bir başlık dosyasından dahil olmasının umurunda değil.) Ayrıca derleyiciye, kaynak dosyanızda gerçekten bildirdiğinizde değişkeni dışa aktarmayı planladığınızı söylemelisiniz.

+0

Bunu yaptı. Teşekkür ederim! – Gili

+0

Lütfen yanılıyorsam beni düzeltin. C derleyicisiyle (MINGW'dan gcc) __declspec (dllexport) kullanmak, C++ derleyicisini (MINGW'den g ++) kullanırken değişkenler için otomatik olarak "extern" anahtar sözcüğünü ekleyecektir ve bu durum, "extern" i açıkça kullanır. – meolic

0

Foo sınıfı büyük olasılıkla üye işlevlerine gerçekte sahip olacak ve başka bir modülden gelenler OP/kabul edilen yanıtla bağlantı hatalarına neden olacaktır. Bağlantı hatalarını ortadan kaldırmak için dışa aktarılan örneği bu modülün dışında kullanmak için sınıf dll export/import olarak tanımlanmalıdır. Bunun üzerine

class API Foo 
{ 
public: 
    Foo() 
    {} 
    void DoSomeWork(); // calling this would cause link error if Foo is not defined as import/export class 
}; 

o API'ler ve ihracat sınıfının her ikisi için mantıklı daha iyi dllexport gibi bir şeyle #define API adlandırmak olabilir dedi.

İlgili konular