3

C++ で記述された静的ライブラリがあり、データ形式を記述する構造体があります。

struct Format{
    long fmtId;
    long dataChunkSize;
    long headerSize;

    Format(long, long, long);

    bool operator==(Format const & other) const;
};

一部のデータ形式は広く使用されており{fmtId=0, dataChunkSize=128, headerSize=0}{fmtId=0, dataChunkSize=256, headerSize=0}

一部のデータ構造クラスはコンストラクターで形式を受け取ります。参照によって渡すことができるいくつかのグローバルFormatメンバーなど、これらの広く使用されている形式の何らかのショートカットが必要です。gFmt128, gFmt256次のような .cpp ファイルでそれらをインスタンス化します

Format gFmt128(0, 128, 0);

そして.hには

extern Format gFmt128;

また、メインモジュールで宣言Format const & Format::Fmt128(){return gFmt128;}して使用しようとしています。

しかし、lib を使用するメイン モジュールで実行しようとすると、リンカは未解決の external について不平を言いgFmt128ます。

ライブラリにこれらのグローバル変数を「エクスポート」させて、他のモジュールから使用できるようにするにはどうすればよいですか?

4

4 に答える 4

7

グローバル宣言で static キーワードを使用しないでください。これは、 static の有無にかかわらず変数の可視性を説明する記事です。static は、グローバルに内部リンケージを与えます。つまり、グローバルが宣言されている翻訳単位でのみ表示されます。

于 2008-09-18T10:21:36.983 に答える
2

Format オブジェクトをstaticではなくexternとして宣言する必要があります

于 2008-09-18T10:18:39.300 に答える
2

それらは .cpp ファイルでも定義されていますか? おおよそ、次のようになります。

struct Format
{
    [...]
    static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }
于 2008-09-18T10:18:04.043 に答える
1

Morhveus、私もこれを試しました。 私のリンカーは、gFmt128 シンボルが既に定義されていると言っています。これは確かに私が期待する動作です。インクルード ファイルで定義されているため、コンパイラはライブラリとクライアント オブジェクトの両方に関数本体を追加します。

未解決の外部を取得する唯一の方法は、

  • リンク対象に静的ライブラリを追加しない
  • スタティック ライブラリのソース ファイルでシンボル gFmt128 を定義していない

私は当惑しています...なぜ私たちは何か違うものを見ているのですか? 何が起こるか説明できますか?

于 2008-09-18T18:29:57.450 に答える