-2

(元の質問を編集して、より理解しやすくしました)

これが問題のプロトタイプです....

//Txn.h --- これには静的変数があり、それを含む pgms で使用できます。

class Txn
{
public:
static int i;
static void incr_int();
};
Txn::i=0;

//Txn.cpp

void Txn::incr_int() {i++;}

-> LibTxn.so
//class1.cpp を作成 -> Txn.h の静的変数を使用して pgm の 1 つを生成

#include Txn.h
Txn::incr_int()

-> LibTxn.so を使用して class1.o を生成します。
// class2.cpp -> Txn.h の静的変数を使用する別の pgm

#include Txn.h
cout<<"Txn::i;

-> LibTxn.so をインクルードして class2.o を作成
-> class1.o,class2.o を使用して class3 (exe) を作成 class1 と 2 の両方に "Txn.h" から "Txn::i=0" というステートメントがあるため、複数の宣言の問題が発生します。
-> .Txn.h から "Txn::i=0" ステートメントを削除すると、"undefined reference" エラーが表示されます。
-> .高レベルでは、この問題は一種のセッション変数を持つことであり、exe 内の任意の func から評価できるはずです。これらの関数は、exe を形成するために使用される任意の obj ファイルに含めることができます。静電気がなくても、どんなソルでも大丈夫です。しかし、別の .o ファイル (このセッション var を使用している) の作成を変更し、.o を組み合わせて exe を生成することはできません。

4

3 に答える 3

1

実際のコードを提供できない場合、または少なくとも実際のコードと同じ問題がある例を提供できない場合、問題が何であるかを正確に把握することは困難です。

ただし、問題の根本的な原因は、宣言しているだけでなく、クラス定義を含むヘッダーファイルでクラスの静的変数を定義していることである可能性があります。

.cppこれは、そのヘッダーを含むすべての変換ユニット(つまりファイル)に静的変数の定義が含まれ、対応するすべてのオブジェクトファイルをマージすると、リンカーは最終的にそのシンボルが複数回定義されていることについて文句を言うことを意味します。

この場合、クラスの定義を含むヘッダーファイルから静的変数の初期化を取り出し、それを1つの(そして1つだけの)ファイルに入れる必要があり.cppます。

于 2013-02-11T14:43:31.827 に答える
0

はい。.cppで静的変数を定義することで機能しました。AndyProwlとiWernerに感謝します。

于 2013-02-20T10:53:41.417 に答える
0

あなたが説明したように問題を再現しようとしましたが、私のコンピューターでは問題なくコンパイルされ、コードを見ずに先に進むことは困難です。

以下のコードでは、ヘッダーはそれをインクルードするすべての .cpp ファイルに通知 (宣言Foo::x) しますがFoo::x、存在 (は で定義) Foo.cpp (および Foo.o)

foo.h:

class Foo {
public:
    static int x;
};

Foo.cpp:

#include "foo.h"

int Foo::x;

main.cpp:

#include <iostream>
#include "foo.h"

int main(int argc, char *argv[]) {
    Foo::x = 42;
    std::cout << "Foo::x is " << Foo::x; 
}
于 2013-02-11T14:54:10.000 に答える