Проблема с связыванием в C ++: множественное определение - PullRequest
1 голос
/ 05 марта 2011

К сожалению, я не могу опубликовать весь исходный код здесь. Я могу описать структуру, хотя. Все заголовочные файлы имеют # ifndef / # define / # endif guard. Структура выглядит следующим образом:

  • node.h - включен tree.h
  • tree.h - включено в tree.cpp и main.cpp
  • tree.cpp
  • main.cpp

В файле node.h в глобальном пространстве имен я объявляю следующую автономную функцию:

bool char_sort_func(Path first, Path second)
{
  return (first->label() < second->label()); 
}

(Примечание: как показано ниже, путь - это просто shared_ptr) Когда я пытаюсь построить, я получаю ошибку множественного определения, говорящую, что функция присутствует как в tree.o, так и в main.o:

> make
g++ -c -g -Wall main.cpp -I /usr/include
g++ -c -g -Wall tree.cpp  -I /usr/include
g++ -Wall -o tool tree.o main.o -L /usr/lib -l boost_program_options
main.o: In function `char_sort_func(boost::shared_ptr<Edge>, boost::shared_ptr<Edge>)':
node.h:70: multiple definition of `char_sort_func(boost::shared_ptr<Edge>, boost::shared_ptr<Edge>)'
tree.o:node.h:70: first defined here
collect2: ld returned 1 exit status
make: *** [all] Error 1

Я попытался найти все исходные файлы, чтобы убедиться, что это правда, однако я не вижу его ни в одном неправильном месте:

> grep char_sort_func *
Binary file main.o matches   
node.h:bool char_sort_func(Path first, Path second) 
node.h:    std::sort(edges_.begin(), edges_.end(), char_sort_func);
Binary file trie.o matches

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

1 Ответ

3 голосов
/ 05 марта 2011

Это произойдет, если вы объявите нормальные функции в файле .h, потому что они будут сгенерированы в каждом файле, который #include это.Возможно, вы хотели объявить это inline или static?

...