(我已经编辑了我的原始问题以使其更容易理解)
这是问题的原型....
// 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 - >其中一个pgm使用来自Txn.h的静态var
#include Txn.h
Txn::incr_int()
- >使用LibTxn.so生成class1.o // class2.cpp - >另一个pgm使用来自Txn.h的静态var
#include Txn.h
cout<<"Txn::i;
- &GT;产生class2.o,包括LibTxn.so
- &GT; .produce class3(一个exe)使用class1.o,class2.o。因为,class1和2都有来自“Txn.h”的语句“Txn :: i = 0”,所以会发生多个声明问题。
- &GT; 。如果从Txn.h中删除“Txn :: i = 0”语句,则会出现“未定义引用”错误。
- &GT; 。高lvl,这个问题是一种会话变量,应该可以从exe中的任何函数中进行评估。那些func可以在用于形成exe的任何obj文件中。我对任何溶胶都很好,即使没有静电。但是我不能改变不同.o文件的创建(使用这个会话var)并组合.o来生成exe。
答案 0 :(得分:1)
如果您无法提供真实代码,或者至少是一个与实际代码具有相同问题的示例,很难弄清楚问题究竟是什么。
但是,问题的根本原因很可能是您不仅要声明,还要在包含类定义的头文件中定义类的静态变量。
这意味着包含该标头的所有翻译单元(即.cpp
文件)将包含静态变量的定义,并且在合并所有相应的目标文件时,链接器最终将抱怨该符号为多次定义。
如果是这种情况,你应该做的是从包含你的类定义的头文件中取出静态变量的初始化,并将它放在一个(只有一个).cpp
文件中。 / p>
答案 1 :(得分:0)
我试图像你描述的那样重新创建问题,但它在我的计算机上编译得很好,如果没有看到你的代码就很难进一步。
在下面的代码中,标题告诉(声明)包含Foo::x
的每个.cpp文件,但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;
}
答案 2 :(得分:0)
是。它通过在.cpp中定义静态变量来工作。 特别感谢Andy Prowl和iWerner。