3

ヘッダーで静的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名を使用しました。同じ問題が発生します。

4

1 に答える 1

1

すべての助けに感謝しますが、ライブラリを呼び出すアプリケーションで初期化を 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

アプリケーション.cpp

#include "Subsys.h"
#include "SubsysParticlesInit.h"

    int main() { ... }

アプリケーションから 1 つではなく 2 つのヘッダーを呼び出す必要がありますが、少なくともすべてのコードがライブラリに含まれています。

于 2011-11-13T23:55:28.697 に答える