C++11 множественные определения функции класса
РЕШЕНО: Я полный тупик. После тщательной проверки всех файлов и отслеживания с помощью нашего собственного генератора файлов зависимостей выясняется, что на самом деле существовали мошеннические включения.cpp, которые недавно были добавлены в файловую систему, и это стало причиной проблемы. Извините, и спасибо всем за помощь всем! XD
У меня неприятная проблема с неясной ошибкой, с которой я надеялся, что кто-то может помочь. По сути, я объявляю универсальный класс в заголовочном файле следующим образом:
//foo.h
#pragma once
class foo
{
public:
foo();
~foo();
void random_function();
};
Обратите внимание, что я объявил прагму один раз, чтобы предотвратить несколько определений, и все прототипы функций помещаются в определение класса. Соответствующий класс определяется так:
// foo.cpp
#include "foo.h"
foo::foo() {
}
foo::~foo(){
}
void foo::random_function(){
//do stuff
}
Этот класс используется во многих других файлах. Например:
// bar.h
#include “foo.h”
class bar
{
bar();
~bar();
std::shared_ptr<foo> get_foo();
std::shared_ptr<foo> my_foo;
};
Но когда я компилирую, я получаю следующую ошибку для каждого члена функции определения класса:
bar.o: In function `foo:foo()':
dir/foo.cpp:80: multiple definition of `foo::foo()'
blah.o:dir/foo.cpp:80: first defined here
bar.o: In function `foo:foo()':
dir/foo.cpp:80: multiple definition of `foo::foo()'
blah.o:dir/foo.cpp:80: first defined here
Обратите внимание, как кажется, что одна и та же ошибка в 3 строки повторяется дважды подряд. Этот же шаблон ошибки повторяется для каждого объявления конструктора / деструктора / функции. Также обратите внимание на то, что кажется, что функция foo() в foo.cpp сначала определяется в foo.cpp, что, похоже, не имеет особого смысла. Но я только заметил, что это начинается с bar.o, а затем говорит blah.o...?
На самом деле, почесывая голову, не могу понять, откуда возникла проблема или куда я должен смотреть. Любая помощь будет принята с благодарностью!:D
Дополнения:
- Я не могу опубликовать оригинальный код, потому что это из моей работы. Я надеюсь, что этот пример фрагмента будет достаточным, чтобы по крайней мере дать некоторое представление о том, где я, вероятно, должен начать искать, за исключением любых проблем с кодом, как он настроен в данный момент.
- Я не включаю никакие файлы.cpp где-либо еще в коде. Я включаю только.h.
- Исходный код имеет точку с запятой в конце объявления класса файла заголовка, просто забыл включить в пример, размещенный здесь. Обновлено, чтобы отразить это.
- Включение файла foo.h одинаково для всех файлов (без случайного смешанного регистра).
- Другие аналогично определенные классы используют этот точно такой же шаблон, но, как ни странно, не генерируют ту же ошибку.:?
- Повторюсь, я уверен, что я не # включаю никакие файлы.cpp где-либо в моей программе, только заголовочные файлы когда-либо включаются в другие части программы.
- Я также уверен, что конструктор объявлен в заголовочном файле как foo(); как в приведенном выше примере кода, а не foo(){}.
- Компилятор поддерживает прагму один раз (используя g++).
- Исправлена другая опечатка в приведенном выше примере, не найденная в исходном коде (кавычки вокруг заголовка файла)
- Система, над которой я работаю, на самом деле довольно большая. Есть много включений и зависимостей по всему коду (даже некоторые циклические зависимости) и использование некоторых синглетонов, которые передаются по всей системе. Приведенный выше пример представляет собой упрощенное представление проблемы, с которой я сталкиваюсь на самом фундаментальном уровне. Я вижу вышеупомянутую ошибку, которая на самом деле генерируется для ряда новых файлов, которые я объединяю в систему (не только для одного), Странно, но другие файлы, которые я определил подобным образом, не создают и до сих пор не создавали эту проблему, поэтому я запутался, что это, похоже, вызывает проблемы сейчас.
1 ответ
Попробуйте добавить в foo.h
#ifndef FOO_H
#define FOO_H
//foo class and stuff
#endif