Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在同一exe但不同对象文件的多个函数中使用共享库的静态变量_C++_Shared Libraries_Linker Errors_Static Members_Multiple Definition Error - Fatal编程技术网

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

C++ 在同一exe但不同对象文件的多个函数中使用共享库的静态变量,c++,shared-libraries,linker-errors,static-members,multiple-definition-error,C++,Shared Libraries,Linker Errors,Static Members,Multiple Definition Error,(我已编辑了我的原始问题,使其更易于理解) 这是问题的原型 //h---它有一个静态变量,可由包含它的PGM使用 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() #i

(我已编辑了我的原始问题,使其更易于理解)

这是问题的原型

//h---它有一个静态变量,可由包含它的PGM使用

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()
#include Txn.h
cout<<"Txn::i;
->使用LibTxn.so生成class1.o。
//class2.cpp->使用Txn.h中的静态变量的另一个pgm

#include Txn.h
Txn::incr_int()
#include Txn.h
cout<<"Txn::i;
#包括Txn.h

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

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

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


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

文件中。

我试图按照您所述重新创建问题,但它在我的计算机上编译得很好,如果没有看到您的代码,很难再进一步

在下面的代码中,头告诉(声明)包含它的每个.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; 
}
#包括
#包括“foo.h”
int main(int argc,char*argv[]){
Foo::x=42;

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

我们无法假设您的代码并给出正确的答案。请包含一些再现错误的代码。不是完整的代码,只是示例中该变量的声明和定义在您的各种文件中;以及如何包含它们。静态变量定义在哪里?不应该包含在标题中,否则包括该标题在内的所有翻译单元都将为其生成定义
(由于安全策略,我无法提供实际代码)
我们甚至不想看到实际代码。我们希望您在最终求助(作为最后一步)之前只花三天的时间进行处理和调试在这里提问。投票结束,因为没有再现问题的代码,就不可能给出真正的答案,只有随机猜测。而且,绝对有可能创建与您遇到的相同问题无关的代码。而且,由于它与任何问题无关,因此不应该有任何安全性发布时涉及到了一个问题。你是对的。这就是问题所在。但是我如何在头文件之外定义它。你能举个例子吗?@Jagan:你已经接受了这个问题的答案,有什么问题吗?现在我很好。在.cpp中定义静态变量之前,我输入了这个注释