1

同じ.hを共有するさまざまな.cppファイルからダイナミックライブラリを作成しようとしています。これは次のようなものです。

// mylib1.cpp
namespace mylib {
    namespace part1 {
        void init() {
            part1::commonvar = true;
        }
    }
}

// mylib2.cpp
namespace mylib {
    namespace part2 {
        void check() {
            if (part1::commonvar == true) {
                // do something
            }
        }
    }
}

これは一般的なヘッダーです

// mylib.h
#ifdef __cplusplus 
extern "C" {
#endif
    namespace mylib {
        namespace part1 {
            bool commonvar = false;
            void init();
        }
        namespace part2 {
            void check();
        }
    }
#ifdef __cplusplus 
}
#endif

私はGCC(MingW)を使用して、これをコンパイルし、次のような単一のDLLにリンクしています。

g++ -Wall -s -O2 -c mylib1.cpp -o mylib1.o
g++ -Wall -s -O2 -c mylib2.cpp -o mylib2.o
g++ -Wall -s -O2 -shared -o MyLib.dll -Wl,--out-implib=lib/libMyLib.dll.a mylib1.o mylib2.o

したがって、私の問題は、これらすべてを実行すると、これら2つのオブジェクトをリンクしようとすると、その変数に対して複数の定義エラーが発生することです。したがって、commonvarを両方の名前空間に共通にするが、両方のオブジェクトファイルに複製しないようにする回避策があるのではないかと思います。必要に応じて、名前空間「mylib」のメンバーにすることができます。また、プリプロセッサコマンドを使用することもできます。

ご協力いただきありがとうございます

4

2 に答える 2

2

constグローバル変数には外部リンケージがあります。グローバル変数の同じ定義を複数の変換ユニットにインポートするcommonvarと、リンカーは最終的に、そのシンボルを複数回定義したことを通知し、単一定義規則に違反します。

externキーワードを使用して、グローバル変数の定義をに変換し、 1つのファイルdeclarationでグローバル変数を定義する必要があります。 .cpp

MyLib.h

namespace mylib {
    namespace part1 {
        extern bool commonvar;
    //  ^^^^^^
        void init();
    }
    namespace part2 {
        void check();
    }
}

MyLib.cpp(または1つしかない.cpp場合は他のファイル)

namespace mylib {
    namespace part1 {
        bool commonvar;
    }
}

インクルードガード(使用している場合)が異なる変換単位での同じシンボルの複数の定義を妨げていない理由がわからない場合は、これを参照してください

于 2013-02-27T14:48:24.970 に答える
0

次はどうですか

  bool* init(){
      static bool commonvar = false;
      return &commonvar;     
  }
于 2013-02-27T14:48:11.560 に答える