我在头文件中声明了静态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 Engines :: Particles :: SubSys :: _ M”(?_M @ SubSys @ Particles @ Engines @@ 0QBIB)
如果我在类之外的头文件中实现该数组,我在使用静态库的应用程序中没有得到LNK2001错误。我在编译静态库时会得到LNK4006(即符号添加多次)。
我还删除了.cpp文件中的命名空间,并使用了完整的Engines :: Particles :: SubSys :: _ M名称。出现同样的问题。
答案 0 :(得分:1)
Als感谢您的所有帮助,但它并没有完全回答我的问题,即在库中使用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,但至少所有代码都包含在库中。