Я изучаю некоторый CSP (ограничительная удовлетворенность) материал теории прямо сейчас и пользуюсь этой библиотекой для парсинга XML-файлов. Я использую XCode в качестве IDE.
Мои прекрасные компиляции программы, но когда это идет для соединения файлов, я получаю дублирующуюся ошибку символа с файлом XMLParser_libxml2.hh. Мои файлы разделяются как таковые:
Заголовочный файл класса, который включает файл XMLParser выше
Файл реализации класса, которые включают заголовочный файл класса
Основной файл, который включает заголовочный файл класса
Дублирующийся символ происходит в main.o и classfile.o, но насколько я могу сказать, я на самом деле не добавляю это .hh файл дважды.
Полная ошибка:
ld: duplicate symbol bool CSPXMLParser::UTF8String::to, std::allocator > >(std::basic_string, std::allocator >&) constin
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-
normal/x86_64/dStructFill.o and
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-
normal/x86_64/main.o`
Копирование реализации класса в основной файл и вынимание файла реализации класса из цели компиляции удаляют ошибку, но это - неорганизованная путаница этот путь, и я буду добавлять больше классов очень скоро (и было бы хорошо иметь их в отдельных файлах).
Поскольку я понял это, это вызывается файлом (XMLParser_libxml2.hh), имеющим обоих класс и функциональное определение и реализация в одном файле (и кажется, как будто это, возможно, было необходимо из-за использования шаблонов в том файле 'заголовка'). Какие-либо идеи о том, как обойти засовывание всех моих файлов класса в моем main.cpp? (Я попробовал #ifdefs
, они не работают).
Джеймс был прав. Три функции шаблона внутри файла заголовка должны быть объявлены встроенными, чтобы он мог правильно связываться. Спасибо!