статическая библиотека: статический константный массив - LNK2001: неразрешенный внешний символ в приложении, использующем библиотеку - PullRequest
3 голосов
/ 12 ноября 2011

Я объявил статический массив 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 и использовал полное имя Engines :: Particles :: SubSys :: _ M. Та же проблема возникает.

1 Ответ

1 голос
/ 14 ноября 2011

Кроме того, спасибо за вашу помощь, но она не вполне ответила на мой вопрос, который заключался в использовании файла cpp внутри самой библиотеки вместо перемещения инициализации в файл cpp в приложении, вызывающем библиотеку.

То, как я решил это, с использованием VC ++ , заключалось в использовании другого заголовочного файла в библиотеке.Этот заголовочный файл содержит все необходимые статические инициализаторы.Затем я просто #include этот файл заголовка из библиотеки в приложении, и он работает.

Полный дизайн:

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

...