在同一个exe但不同的对象文件的多个函数中使用共享库的静态变量

Using a static variable of a shared library in more than one functions of a same exe, but different object file

本文关键字:函数 共享 变量 静态 exe 同一个 文件 对象      更新时间:2023-10-16

(我编辑了我原来的问题,使其更容易理解)

这是这个问题的原型。。。。

//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 的静态var的pgm之一

#include Txn.h
Txn::incr_int()

->使用LibTxn.so生成class1.o。
//class2.cpp->使用来自Txn.h 的静态var的另一个pgm

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

->通过包含LibTxn.so生成class2.o
->.使用class1.o、class2.o生成class3(一个exe)。由于class1和class2都有来自"Txn.h"的语句"Txn::i=0",因此会发生多个声明问题
->。如果我从Txn.h中删除语句"Txn::I=0",则出现"未定义引用"错误
->在高lvl下,这个问题是一种具有会话变量的问题,该会话变量应该可以从exe中的任何函数中进行评估。这些函数可以在用于形成exe的任何obj文件中。我对任何溶胶都很好,即使没有静电。但是我不能改变创建不同的.o文件(使用这个会话var)和组合.o来生成exe。

如果您不能提供真实的代码,或者至少不能提供一个与真实代码有相同问题的示例,那么很难准确地找出问题所在。

然而,问题的根本原因很可能是您不仅在声明,而且在包含类定义的头文件中定义了类的静态变量

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

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

我试图按照您描述的那样重新创建这个问题,但它在我的计算机上编译得很好,如果不看到您的代码,很难继续下去。

在下面的代码中,头告诉(声明)包含它的每个.cpp文件关于Foo::x,但Foo::x存在于(<em]在>中定义)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; 
}

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