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
Другие вопросы по тегам