2011-11-11 109 views
3

我已經在頭文件中聲明瞭靜態常量數組,然後在cpp文件中實現它,但是我無法弄清楚發生了什麼。靜態庫:靜態常量數組 - LNK2001:應用程序使用庫中無法解析的外部符號

Subsys.h:

#ifndef _SUBSYS_H 
#define _SUBSYS_H 

namespace Engines 
{ 

    namespace Particles 
    { 

     class SubSys : public ISubSys 
     { 

     private: 
      static const int _M[ 3 ]; 
      ... 
      //rest of class 
     }; 

    } 

} 

#endif 

Subsys.cpp:

#include "Subsys.h" 

namespace Engines 
{ 

    namespace Particles 
    { 

     const int SubSys::_M[ 3 ] = 
     { 
      0x80, 
      0x7f, 
      0x01 
     }; 

    } 

} 

錯誤LNK2001:無法解析的外部符號 「私有靜態詮釋常量* const的發動機::顆粒:: SUBSYS :: _ M」 (?_M @ SubSys @ Particles @ Engines @@ 0QBIB)

如果我在類外的頭中實現數組,我不會在使用靜態庫的應用程序中得到LNK2001錯誤。當編譯靜態庫時,我確實得到了LNK4006(即不止一次添加了符號)。

我也刪除了.cpp文件中的命名空間,並使用完整的Engines :: Particles :: SubSys :: _ M名稱。發生同樣的問題。

回答

1

Als感謝您的所有幫助,但它並沒有完全回答我的問題,即在庫本身中使用cpp文件,而不是在調用庫的應用程序中將初始化移動到cpp文件中。

我使用VC++解決它的方法是,它使用庫中的另一個頭文件。該頭文件包含所有需要的靜態初始值設定項。然後,我只是從應用程序庫中包含該頭文件並且它可以工作。

完整的設計是:

Subsys.h

#ifndef _SUBSYS_H 
#define _SUBSYS_H 

namespace Engines 
{ 

    namespace Particles 
    { 

     class SubSys : public ISubSys 
     { 

     private: 
      static const int _M[ 3 ]; 
      ... 
      //rest of class 
     }; 

    } 

} 

#endif 

SubsysParticlesInit.h

#ifndef _SUBSYS_PARTICLES_INIT_H 
#define 

#include "Subsys.h" 

namespace Engines 
{ 
    namespace Particles 
    { 
     const int SubSys::_M[ 3 ] = 
     { 
      0x80, 
      0x7f, 
      0x01 
     }; 
    } 
} 

#endif 

Application.cpp

#include "Subsys.h" 
#include "SubsysParticlesInit.h" 

    int main() { ... } 

它需要從應用程序調用2個標頭而不是1個,但至少所有代碼都包含在庫中。

相關問題