静态库:静态const数组 - LNK2001:使用库在应用程序中未解析的外部符号

时间:2011-11-11 21:00:21

标签: c++ arrays static 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 Engines :: Particles :: SubSys :: _ M”(?_M @ SubSys @ Particles @ Engines @@ 0QBIB)

如果我在类之外的头文件中实现该数组,我在使用静态库的应用程序中没有得到LNK2001错误。我在编译静态库时会得到LNK4006(即符号添加多次)。

我还删除了.cpp文件中的命名空间,并使用了完整的Engines :: Particles :: SubSys :: _ M名称。出现同样的问题。

1 个答案:

答案 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,但至少所有代码都包含在库中。