Ошибки связи с использованием FANN
Я пытаюсь создать базовый проект FANN (Fast Artificial Neural Network) для Windows с MinGW. Однако всякий раз, когда я пытаюсь связать исполняемый файл, я сталкиваюсь с кучей undefined reference to
ошибки. Интересно, что если я вообще не связываю библиотеку, я получаю больше ошибок, подразумевая, что, по крайней мере, часть библиотеки работает. Код файла, который я пытаюсь скомпилировать и связать:
#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;
}
и команда, которую я использую для компиляции и ссылки:
gcc -Wall -Ifann\src\include titanic-train.c -Lfann\bin -lfanndouble -o titanic-train.exe
Я получаю следующие ошибки:
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
Если я вообще не связываю библиотеку, я получаю:
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
Редактировать:
По просьбе Харугана я побежал nm fanndouble.lib
, Вывод довольно обширный, поэтому вместо того, чтобы вставлять все это здесь, я сделал его доступным через pastebin здесь: http://pastebin.com/raw.php?i=vybFhEcX
Я не знаком с nm
, но кажется, что пропущенные символы существуют в файле.
Редактировать № 2:
Содержимое doublefann.h: http://pastebin.com/mrHKJi8C
и содержимое fann.h, которое оно включает в себя: http://pastebin.com/gTrHCYAg
Может ли проблема быть просто решена путем перекомпиляции библиотеки с MinGW?
Редактировать № 3:
Внесение изменений, предложенных Харуганом, сработало! В дополнение к этим изменениям мне пришлось изменить файл CMakeLists.txt для FANN, добавив:
if (WIN32)
ADD_DEFINITIONS(-DFANN_DLL_EXPORTS)
endif (WIN32)
Затем работает cmake -G "MinGW Makefiles"
а потом mingw32-make
в корне проекта был создан файл libdoublefann.dll, который, когда он был связан с каталогом.exe и включен в него, позволил мне, наконец, запустить мою программу.
1 ответ
В doublefann.h
на линии № 116:
#if (_MSC_VER > 1300)
изменить на:
#if (_MSC_VER > 1300) || defined(__MINGW32__) || defined(__MINGW64__)
Кроме того, в строке #121:
#if defined(_MSC_VER) && (defined(FANN_USE_DLL) || defined(FANN_DLL_EXPORTS))
изменить на:
#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)) && \
(defined(FANN_USE_DLL) || defined(FANN_DLL_EXPORTS))