Использование статической переменной общей библиотеки в нескольких функциях одного и того же exe-файла, но в другом объектном файле

(я отредактировал свой оригинальный вопрос, чтобы сделать его более понятным)

вот прототип для проблемы ….

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

#include Txn.h
Txn::incr_int()

-> Произведите class1.o, с помощью LibTxn.so.
// class2.cpp -> другой pgm, использующий статическую переменную из Txn.h

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

-> производить class2.o, включая LibTxn.so
-> .произвести class3 (exe), используя class1.o, class2.o. Поскольку оба класса1 и 2 имеют оператор «Txn :: i = 0» из «Txn.h», возникает проблема множественного объявления.
->. Если я удаляю оператор «Txn :: i = 0» из Txn.h, то появляется ошибка «неопределенная ссылка».
->. При высоком уровне lvl эта проблема является своего рода наличием переменной сеанса, которая должна быть оценена по любой функции в exe. Эти функции могут быть в любых файлах obj, используемых для формирования exe. Я в порядке для любого золя, даже без статики. Но я не могу изменить создание различных файлов .o (которые используют эту сессию var) и комбинирование .o для создания exe.

-2

Решение

Я пытался воссоздать проблему, как вы описали, но она прекрасно скомпилировалась на моем компьютере, и трудно пойти дальше, не увидев ваш код.

В приведенном ниже коде заголовок говорит (объявляет) каждый файл .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;
}
0

Другие решения

Трудно точно понять, в чем проблема, если вы не можете предоставить реальный код или хотя бы пример, который имеет ту же проблему, что и реальный код.

Тем не менее, наиболее вероятной причиной проблемы является то, что вы не только декларируете, но и определяющий статическая переменная вашего класса в заголовочном файле, который содержит определение класса.

Это означает, что все единицы перевода (т.е. .cpp файлы), которые включают этот заголовок, будут содержать определение статической переменной, и при объединении всех соответствующих объектных файлов компоновщик в конечном итоге будет жаловаться на то, что этот символ определен несколько раз.

Если это так, то вам следует взять инициализацию статической переменной из файла заголовка, который содержит определение вашего класса, и поместить его в один (и только один) .cpp файл.

1

Да. это работало путем определения статической переменной в .cpp.
Отдельное спасибо Энди Проулю и iWerner.

0
По вопросам рекламы [email protected]