Насколько я вижу (grep '#include .*\.c'
), они делают это только в файлах doublefann.c, fixedfann.c и floatfann.c и каждый раз включают причину:
/* Easy way to allow for build of multiple binaries */
Такое точное использование препроцессора для простого вставки копий действительно является единственным допустимым использованием включающих файлы реализации (* .c) и является относительно редким. (Если вы хотите включить некоторый код по другой причине, просто дайте ему другое имя, например * .h или * .inc.) Альтернативой является указание конфигурации в макросах, передаваемых компилятору (например, -DFANN_DOUBLE, -DFANN_FIXED или -DFANN_FLOAT), но они не использовали этот метод. (У каждого подхода есть свои недостатки, поэтому я не говорю, что они обязательно ошибочны, мне нужно детально изучить этот проект).
Они предоставляют make-файлы и проекты MSVS, которые уже не должны связывать doublefann.o (из doublefann.c) с fann.o (из fann.c) или fixedfann.o (из fixedfann.c) и так далее, либо их файлы испорчены, либо что-то подобное пошло не так.
Вы пытались создать проект с нуля (или использовать существующий проект) и добавить в него все файлы? Если вы это сделали, то происходит то, что каждый файл реализации компилируется независимо, а результирующие объектные файлы содержат противоречивые определения. Это стандартный способ работы с файлами реализации, и многие инструменты предполагают это. Единственное возможное решение состоит в том, чтобы исправить настройки проекта, чтобы не связывать их вместе. (Хорошо, вы могли бы также радикально изменить их источник, но это не совсем решение.)
Пока вы занимаетесь этим, если вы продолжите без использования настроек проекта, вы, вероятно, можете пропустить компиляцию fann.c, et. и др. и, возможно, достаточно просто удалить их из проекта & ndash; тогда они не будут скомпилированы и связаны. Вы захотите выбрать точно один из double- / fixed- / floatfann для использования, в противном случае вы получите те же ошибки ссылки. (Я не смотрел на их инструкции, но не удивлюсь, если это резюме будет объяснено более подробно.)