статическая библиотека: статический массив const — LNK2001: неразрешенный внешний символ в приложении с использованием библиотеки

#c #arrays #static #lnk2001

#c #массивы #статический #lnk2001

Вопрос:

Я объявил статический массив const в заголовке, а затем реализовал его в файле cpp, но я не могу понять, что происходит.

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: неразрешенный внешний символ «private static int const * const Движки::Particles::SubSys::_M» (?_M@SubSys@Particles@Engines@@0QBIB)

Если я реализую массив в заголовке вне класса, я не получаю ошибку LNK2001 в приложении, использующем статическую библиотеку. Однако я получаю LNK4006 при компиляции статической библиотеки (т. Е. символ добавляется более одного раза).

Я также удалил пространства имен в файле .cpp и использовал полные движки:: Particles::SubSys::_M name. Возникает та же проблема.

Ответ №1:

Также спасибо за всю вашу помощь, но это не совсем ответило на мой вопрос, который заключался в использовании 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, но, по крайней мере, весь код содержится в библиотеке.