ОК, ребята. Я исправил ошибку, переместив определение переменной, но не понимаю, почему возникает проблема.
Упрощенный фон: у меня есть объект, и я хочу отслеживать все экземпляры этого объекта в списке, поэтому я просто создал список<> статический член класса. Ниже было простое представление, которое позволило мне поиграть с ним. Если у меня есть строка, помеченная как «эта линия» в статической библиотеке. Я получаю ошибку во время выполнения. Объект определен в заголовочном файле и является одинаковым заголовочным файлом в обоих местах. Если я перенесу «эту строку» в код в моем окончательном приложении, и это сработает …. Почему? Я просто не понимаю, почему это отличается.
#include "stdafx.h"#include <list>
using namespace std;
class someobject
{
public:
someobject()
{
// do some stuff.
theStaticList.push_back(this);
}
void func()
{
printf("Made it!!\n");
}
static list<someobject*> theStaticList;
};
list<someobject*> someobject::theStaticList; //*** This linesomeobject global;
int main()
{
someobject initial;
initial.func();
global.func();
list<someobject*>::iterator iter;
printf("\n\nLoop the Static List\n");
for (iter = someobject::theStaticList.begin(); iter != someobject::theStaticList.end (); iter++)
(*iter)->func();
return 0;
}
Если вы поместите эту строку в файл заголовка, а затем включите заголовок в два или более исходных файла, вы определяете объект списка в каждом исходном файле, куда включается заголовок.
Это нарушает правило одного определения, поэтому компоновщик совершенно правильно выдаст вам ошибку, когда вы это сделаете.
Вы хотите определить объект в один (и только один) исходный файл. Для библиотеки это должен быть некоторый объектный файл в библиотеке, а не исходный файл пользователя (по крайней мере, как общее правило).
Других решений пока нет …