据我所知(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),但他们没有使用这种方法。(每种方法都有缺点,所以我并不是说它们一定是错误的,我必须深入研究该项目才能确定这一点。)
他们提供了 makefile 和 MSVS 项目,这些项目不应将doublefann.o(来自 doublefann.c)与 fann.o(来自 fann.c)或 fixedfann.o(来自 fixedfann.c)等链接,并且它们的文件是搞砸了或类似的事情出错了。
您是否尝试从头开始创建项目(或使用现有项目)并将所有文件添加到其中?如果你这样做了,发生的事情是每个实现文件都被独立编译,并且生成的目标文件包含冲突的定义。这是处理实现文件的标准方式,许多工具都采用这种方式。唯一可能的解决方案是修复项目设置以不将它们链接在一起。(好吧,你也可以彻底改变他们的来源,但这并不是真正的解决方案。)
当你这样做的时候,如果你继续不使用他们的项目设置,你可能会跳过编译 fann.c 等。人。并且可能只是从项目中删除它们就足够了——那么它们就不会被编译和链接。您需要准确地选择一个double-/fixed-/floatfann 来使用,否则您将得到相同的链接错误。(我没有看过他们的说明,但看到这个摘要在那里更深入地解释了一点,我不会感到惊讶。)