2011-11-11 4 views
3

Я объявил статический массив const в заголовке, а затем реализовал его в файле cpp, но я не могу понять, что происходит.статическая библиотека: static const array - 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: неразрешенный внешний символ "частные статические ИНТ константные * константные Двигатели :: Particles :: Subsys :: _ М" (? _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, но по крайней мере весь код содержится в библиотеке.