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