在同一个exe但不同的对象文件的多个函数中使用共享库的静态变量
Using a static variable of a shared library in more than one functions of a same exe, but different object file
(我编辑了我原来的问题,使其更容易理解)
这是这个问题的原型。。。。
//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。
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 从python调用openMP共享库时,未定义opnMP函数
- 使用共享指针的函数调用,其对象应为 const
- 是否有 Windows 用户空间函数来枚举连接的网络共享?
- 模板函数如何处理可能共享一个交集的多个类型名称?
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 如何将共享指针用作函数参数
- Linux c++.在预加载的共享库中定义的基类的崩溃调用函数
- 使用 Flutter 从 Android 上的原生编译共享库中调用函数
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 如何实现共享数据的复制构造函数
- 将C++中的多个参数传递给MatLab共享库函数
- 如何在共享库中保留静态库中的自由函数
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- C++11 与不同类型的随机分布共享相同的函数
- 共享对象中的符号名称与文件中.cpp函数不同
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 不同类的虚拟函数共享相同的(无效?)内存地址
- 用于创建具有 cuda 函数C++共享库的生成文件