-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 之一

#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”,则会出现“未定义引用”错误。
-> .在高等级,这个问题是一种具有会话变量的问题,应该可以从 exe 中的任何 func 进行评估。这些 func 可以在用于形成 exe 的任何 obj 文件中。我适合任何溶胶,即使没有静电。但我无法更改不同 .o 文件(正在使用此会话 var)的创建并结合 .o 来生成 exe。

4

3 回答 3

1

如果您无法提供真实代码,或者至少无法提供与真实代码存在相同问题的示例,则很难准确找出问题所在。

但是,问题的根本原因很可能是您不仅要声明,还要在包含类定义的头文件中定义类的静态变量。

这意味着.cpp包含该标头的所有翻译单元(即文件)都将包含静态变量的定义,并且在合并所有相应的目标文件时,链接器最终会抱怨该符号被多次定义。

如果是这种情况,您应该做的是将静态变量的初始化从包含类定义的头文件中取出,并将其放入一个(并且只有一个).cpp文件中。

于 2013-02-11T14:43:31.827 回答
0

我试图按照您的描述重新创建问题,但它在我的计算机上编译得很好,而且如果没有看到您的代码就很难走得更远。

在下面的代码中,标头告诉(声明)包含它的每个 .cpp 文件Foo::x,但Foo::x位于(定义在)Foo.cpp(和 Foo.o)中

富.h:

class Foo {
public:
    static int x;
};

Foo.cpp:

#include "foo.h"

int Foo::x;

主.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 回答
0

是的。它通过在 .cpp 中定义静态变量来工作。特别感谢 Andy Prowl 和 iWerner。

于 2013-02-20T10:53:41.417 回答