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

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

Подсистема.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 Engines::Particles::SubSys::_M" (?_M@SubSys@Particles@Engines@@0QBIB)

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

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


person Hans    schedule 11.11.2011    source источник


Ответы (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, но по крайней мере весь код содержится в библиотеке.

person Hans    schedule 13.11.2011