2009-03-01 18 views
1

Visual Studio 2008'de bir proje oluşturmaya çalışıyorum. Gerçekten rahatsız edici bir sürü bağlantı hataları alıyorum. Uygulamam, yalnızca yerel ANSI C++ kullanan bir Win32 konsol uygulaması.Başlık dosyasında sınıfın özel üyeleriyle bağlantı hataları

Aynı modeldeki tüm bağlayıcı hataları vardır. Linker hataları, kendi başlık dosyamda tanımladığım her bir özel statik veri üyesiyle ilgilidir.

Bu muhtemelen C++ 'ın basit bir gerçeği olduğunu tahmin ediyorum.

Örnek: TekDelay üyelerine, TekDelay üye sınıflarının işlev tanımları içindeki Delays.cpp dosyasında başvuruyorum. yani:

SingleDelay::tick(void *output, void *input, int nbufferFrames)<br>{ 
    //.. code here<br> 
    x = dry * castInput + wet * castInput;<br> 
} 

Hata 38 hata LNK2001: çözülmemiş dış simge "Özel: Statik çift SingleDelay :: kuru" (kuru @ SingleDelay @@ 0NA?) Delays.obj Gecikmeler SingleDelay arasında TestAll

Tanımlı .h:

class SingleDelay{ 

    private: 
     static double dry; //% of dry signal<br> 
     static double wet; //% of wet signal<br> 
     static unsigned int delay; //Delay in milliseconds<br> 
     static int delayCell; //Index in the delayBuffer of the delay to add<br> 
     static double *delayBuffer; //Delay buffer is 1 second long at sample rate SAMPLE_RATE<br> 
     static unsigned int bufferCell; //Pointer to the current delay buffer cell<br> 

    public: 

     //Tick function 
     static void tick(void *output, void *input,int nBufferFrames); 

     //Set and Get functions 
     static void setSingleDelay(double tDry, double tWet, unsigned int tDelay); 
     static void setSingleDelay(void); 

     static void setDry(double tDry); 
     static void setWet(double tWet); 
     static void setDelay(unsigned int tDelay); 

     static double getDry(){ return dry;} 
     static double getWet(){ return wet;} 
     static unsigned int getDelay(){ return delay;} 

     static void initializeDelayBuffer(){ 
      destroyDelayBuffer(); 

      delayBuffer = new double[bufferLength]; 
     } 
     static void destroyDelayBuffer(){ 
      delete[ ] delayBuffer; 
     } 
}; 
+0

Aldığınız bağlantı hatasını listeleyebilir misiniz? –

+0

Yyeha, tam linker erros yayınlamak isteyebilirsiniz, bu yüzden nedenini ne olabileceğini önerebiliriz. –

+0

Yea, Fark ettim ki, iki örnek hata ve bazı ilgili kodları ekledim. – Rich

cevap

2
  1. Belki de kütüphaneyi eklemediniz ve kullandığınız kitaplık yollarını proje tanımlarına eklemediniz?
  2. C++ hatası bakmak her zaman eğlenceli. Ya da değil. Her durumda, statik değişkenlerinizi herhangi bir yerde başlatıyor musunuz? Bunu bir yerde bir .cpp dosyasında yapmalısınız. Statik değişkenleri dikkatli bir şekilde kullanmayı unutmayın. Gerçekten de küresel değişkenlerdir ve çok iş parçacıklı, daha zor gibi gelecekteki değişiklikleri yapabilirler.
+0

2. Evet, sorunun neden olduğu statik değişkenlerin başlatılacağını düşündüm. Bu bir .cpp içinde yapılmalı mı yoksa .h dosyasındaki sınıf tanımından sonra yapabilir miyim? Sınıfı kullandığımda başlatılan değerlerin üzerine yazılacak, bu yüzden benim için çok önemli değiller. – Rich

+0

Statik olarak, tüm geciktirme sınıflarım statik yaptım çünkü amacım için, kullanıcı her seferinde yalnızca bir tanesini kullanıyor, bu yüzden sınıfın taklit edilmesi gereksiz görünüyordu ve gerçekten de bana sıkıntı çekiyor olabilir. Statik durarak kaçınmak zorundayım. – Rich

+0

Tamam, değişkenleri tekrar başlatmaya çalıştım ve bu sefer çalıştı. Görünüşe göre ilk defa küçük hatalar yapıyordum. Herkese yardım ettiğin için teşekkürler, bazen diğerlerini aynı şeyi iki kere denemeye zorlar.). – Rich

0

.cpp ve .h dosyalarını .vcproj dosyasına eklemeniz gerekir.

+0

Bunun ne anlama geldiğinden emin değilim. .vcproj dosyalarımı bir metin düzenleyicisi veya başka bir şeyle elle düzenlemiyorum. Projem için Çözüm Gezgini'ndeki başlık dosyaları açılır menüsüne gerekli tüm gerekli dosyaları sürükleyip bıraktım. Ben de Kaynak Dosyaları menüsünde bulabileceğiniz * .cpp dosyaları koydum. – Rich

+0

Ben kontrol ettim ve aslında # 2 için benim linker hataların çoğunu temizlemek için görünüyordu bazı .cpp dosyaları eksik. Hala aldığım tüm # 1 tipi linker hatalarıyla ne yapacağımı bilmiyorum. – Rich

+0

Goto Project-> Dosyaları Ekle ve sürükleyip bırakma yerine .cpp ve .h'yi seçin. – Vinay

6

Hepsi aynı modele ait bağlayıcı hatalarıdır. Bağlayıcı hataları, kendi başlık dosyalarında tanımladığım her bir özel statik veri üyesiyle ilgilidir.

Tüm statik veri üyeleri zorunluluk .cpp dosyası yere bir tanım var.

Hata 38 hata LNK2001: çözülmemiş dış simge "Özel: Statik çift SingleDelay :: kuru" (? Kuru @ SingleDelay @@ 0NA) Delays.obj TestAll

bağlayıcı olduğunu anlatıyor orada bu değişken için tanımlanmış bir depolama alanı değildir. Bu hat zorunluluk tam olarak bir .Cpp dosyasında bir yerde görünür: onlar özeldir çünkü

double SingleDelay::dry = 0.0; 
0

Belki hata, statik alanları görünürlüğü kapsamında oluşmaktadır. Sınıfınızdaki değil, sınıf tanımındaki statik alanınızı kullanan kod yazmayı deneyin. Sadece sınıf tanımınızda bu yöntemi yazın:

class SingleDelay{ 
... 
int tick(void *output, void *input, int nbufferFrames) 
{ //.. code here 
x = dry * castInput + wet * castInput; 
} 
... 
} 
İlgili konular