在同一个exe的多个函数中使用共享库的静态变量,但是不同的目标文件

时间:2013-02-11 14:31:36

标签: c++ shared-libraries linker-errors static-members multiple-definition-error

(我已经编辑了我的原始问题以使其更容易理解)

这是问题的原型....

// 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。

3 个答案:

答案 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。