首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FANN的链接错误

使用FANN的链接错误
EN

Stack Overflow用户
提问于 2013-10-10 03:15:17
回答 1查看 1.4K关注 0票数 0

我试图用MinGW在Windows上建立一个基本的FANN (快速人工神经网络)项目。但是,每当我试图链接可执行文件时,都会遇到一堆undefined reference to错误。有趣的是,如果我根本不链接库,我会收到更多的错误,这意味着至少有一些库正在工作。我试图编译和链接的文件的代码是:

代码语言:javascript
复制
#include "doublefann.h"

int main() {
    const unsigned int num_input_neurons = 9;
    const unsigned int num_output_neurons = 1;
    const unsigned int num_layers = 3;
    const unsigned int num_hidden_neurons = 9;
    const float desired_error = (const float) 0;
    const unsigned int max_epochs = 500000;
    const unsigned int epochs_between_reports = 1000;

    struct fann *ann = fann_create_standard(num_layers,
                                            num_input_neurons,
                                            num_hidden_neurons,
                                            num_output_neurons);

    fann_set_activation_function_hidden(ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output(ann, FANN_SIGMOID_SYMMETRIC);

    fann_train_on_file(ann,
                       "titanic-training.data",
                       max_epochs,
                       epochs_between_reports,
                       desired_error);

    fann_save(ann, "titanic.net");

    fann_destroy(ann);

    return 0;
}

我用来编译和链接的命令是:

代码语言:javascript
复制
gcc -Wall -Ifann\src\include titanic-train.c -Lfann\bin -lfanndouble -o titanic-train.exe

我所犯的错误是:

代码语言:javascript
复制
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0x7f): undefined reference to `fann_set_activation_function_hidden'           
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0x93): undefined reference to `fann_set_activation_function_output'           
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0xbf): undefined reference to `fann_train_on_file'                            
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0xd3): undefined reference to `fann_save'                                     
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0xdf): undefined reference to `fann_destroy'                                  
c:/fragileprograms/mingw-native/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o: bad reloc address 0x64 in section `.rdata'                                                                                                                 
c:/fragileprograms/mingw-native/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation                   
collect2.exe: error: ld returned 1 exit status 

如果我根本不链接图书馆,我会得到:

代码语言:javascript
复制
C:\Users\kunkelwe\AppData\Local\Temp\ccyOO3jL.o:titanic-train.c:(.text+0x67): undefined reference to `fann_create_standard'
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0x7f): undefined reference to `fann_set_activation_function_hidden'           
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0x93): undefined reference to `fann_set_activation_function_output'           
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0xbf): undefined reference to `fann_train_on_file'                            
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0xd3): undefined reference to `fann_save'                                     
C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o:titanic-train.c:(.text+0xdf): undefined reference to `fann_destroy'                                  
c:/fragileprograms/mingw-native/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\kunkelwe\AppData\Local\Temp\ccsWQg66.o: bad reloc address 0x64 in section `.rdata'                                                                                                                 
c:/fragileprograms/mingw-native/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation                   
collect2.exe: error: ld returned 1 exit status

编辑:

按照Haroogan的要求,我运行了nm fanndouble.lib。输出是相当广泛的,所以不是粘贴在这里,而是通过pastebin这里:http://pastebin.com/raw.php?i=vybFhEcX提供的。

我不熟悉nm,但文件中似乎确实存在缺少的符号。

编辑#2:

双左撇子的内容是:http://pastebin.com/mrHKJi8C

它包含的内容包括:http://pastebin.com/gTrHCYAg

用MinGW重新编译库可以解决这个问题吗?

编辑#3:

做出原野所建议的改变是有效的!除了这些更改之外,我还必须通过添加以下内容来修改FANN的CMakeLists.txt文件:

代码语言:javascript
复制
if (WIN32)
ADD_DEFINITIONS(-DFANN_DLL_EXPORTS)
endif (WIN32)

然后,运行cmake -G "MinGW Makefiles",然后在项目根目录中运行mingw32-make,生成一个名为libdoublefann.dll的文件,当将该文件链接到.exe目录并包含该文件时,最终允许我运行我的程序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 13:08:09

在第116号行的doublefann.h中:

代码语言:javascript
复制
#if (_MSC_VER > 1300)

改为:

代码语言:javascript
复制
#if (_MSC_VER > 1300) || defined(__MINGW32__) || defined(__MINGW64__)

此外,在第121行:

代码语言:javascript
复制
#if defined(_MSC_VER) && (defined(FANN_USE_DLL) || defined(FANN_DLL_EXPORTS))

改为:

代码语言:javascript
复制
#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)) && \
    (defined(FANN_USE_DLL) || defined(FANN_DLL_EXPORTS))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19286450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档