К сожалению, я не могу опубликовать весь исходный код здесь. Я могу описать структуру, хотя. Все заголовочные файлы имеют # 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
Конечно же, это в двоичных файлах. Как я могу реструктурировать свой код, чтобы предотвратить эту проблему с ссылками?