(я отредактировал свой оригинальный вопрос, чтобы сделать его более понятным)
вот прототип для проблемы ….
//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.
Я пытался воссоздать проблему, как вы описали, но она прекрасно скомпилировалась на моем компьютере, и трудно пойти дальше, не увидев ваш код.
В приведенном ниже коде заголовок говорит (объявляет) каждый файл .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;
}
Трудно точно понять, в чем проблема, если вы не можете предоставить реальный код или хотя бы пример, который имеет ту же проблему, что и реальный код.
Тем не менее, наиболее вероятной причиной проблемы является то, что вы не только декларируете, но и определяющий статическая переменная вашего класса в заголовочном файле, который содержит определение класса.
Это означает, что все единицы перевода (т.е. .cpp
файлы), которые включают этот заголовок, будут содержать определение статической переменной, и при объединении всех соответствующих объектных файлов компоновщик в конечном итоге будет жаловаться на то, что этот символ определен несколько раз.
Если это так, то вам следует взять инициализацию статической переменной из файла заголовка, который содержит определение вашего класса, и поместить его в один (и только один) .cpp
файл.
Да. это работало путем определения статической переменной в .cpp.
Отдельное спасибо Энди Проулю и iWerner.