Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

FANN cpp w Eclipse

Ostatnio zmodyfikowano 2020-03-03 21:49
Autor Wiadomość
Slawek1975
Temat założony przez niniejszego użytkownika
FANN cpp w Eclipse
» 2020-02-28 12:38:32
Po dołączeniu ścieżki dostępu do GCC C++ Compiler include  ("F:\eclipse\Workspace\TestClass\FANN-2.2.0-Source\src\include")
i dołączeniu do MinGw C++ Linker ścieżki ("F:\eclipse\Workspace\TestClass\FANN-2.2.0-Source\bin") i biblioteki fannfloat
gdy chcę skorzystać z przykładu:
C/C++
const unsigned int num_layers = 3;
const unsigned int num_input = 2;
const unsigned int num_hidden = 3;
const unsigned int num_output = 1;

FANN::neural_net net;
net.create_standard( num_layers, num_input, num_hidden, num_output );

pojawia się błąd:

undefined reference to `fann_get_user_data'
undefined reference to `fann_destroy'
undefined reference to `fann_create_standard_array'

(możliwe, że temat jest już gdzieś na Waszym forum, jednak nie działa wyszukiwarka)

P-176297
DejaVu
» 2020-02-28 12:55:12
To jest błąd linkera. Oznacza to, że nie dołączyłeś biblioteki FANN do projektu.
P-176298
pekfos
» 2020-02-28 16:25:08
Podaj log kompilacji, a nie same błędy. W logu będą wywołania narzędzi ze wszystkimi argumentami, możesz potrzebować pogrzebać w ustawieniach środowiska, żeby je dostać.

i dołączeniu do MinGw C++ Linker ścieżki ("F:\eclipse\Workspace\TestClass\FANN-2.2.0-Source\bin") i biblioteki fannfloat
Dziwna ta ścieżka. Typowo biblioteki są w lib.
P-176299
mizie
» 2020-03-02 09:11:19
Wnioskując ze ścieżki dostępu i nazwy biblioteki próbujesz używać wersji prebuilt (MSVC). Nie zadziała ona z GCC (zweryfikowane). Dlaczego można sprawdzić poniżej:

http://www.mingw.org/wiki​/Interoperability_of_Libraries_Created_by_Different_Compiler_Brands

Najpierw musisz zbudować biblioteki FANN samemu. W tym celu ściągnij:

https://cmake.org/download/

Podczas instalacji automatycznie dodaj ścieżkę do CMake do zmiennej środowiskowej PATH. Po zakończeniu instalacji dodaj do systemu dwie zmienne środowiskowe:

CC gcc.exe
CXX g++.exe

Dzięki nim CMake wie jakich kompilatorów używać. Następnie z wiersza poleceń wejdź do katalogu, do którego rozpakowałeś FANN i po kolei wykonaj dwa polecenia:

cmake . -G "Eclipse CDT4 - MinGW Makefiles"
mingw32-make

Wejdź do podkatalogu examples i ponownie uruchom:

mingw32-make

Zauważ, że xor_sample.cpp (przykładowy program, korzystający z FANN Wrapper for C++, którego próbujesz używać) nie został włączony do Makefile i skompilowany. O tym dalej. Biblioteki znajdują się w podkatalogu src (należy je dodatkowo skopiować do katalogu examples jeżeli chcesz bezproblemowo uruchamiać przykłady). Teraz w Eclipse (należy zmienić ścieżki dostępu na odpowiadające twojej instalacji):

Menu File -> New -> C/C++ Project
Okno Templates for New C++ Project
C++ Managed Build
Next

Okno C++ Project
Project name: fanncpptest
Project type: Executable -> Empty Project
Toolchains: MinGW GCC
Next

Okno Select Configuration
Advanced Settings...

Okno Properties for fanncpptest
C/C++ Build -> Configuration -> [ All configurations ]
C/C++ Build -> Settings:
GCC C++ Compiler - > Include paths (-I) -> Add C:\MinGW\FANN\src\include
MinGW C++ Linker -> Libraries (-l) -> Add libfloatfann
MinGW C++ Linker -> Library search path (-L) -> Add C:\MinGW\FANN\src
Apply and Close

Okno Select Configuration
Finish

Menu Project -> Build Configurations -> Set Active -> Release

Do projektu dodajesz nowy plik źródłowy z twoim kodem (pamiętaj o #include "floatfann.h", #include "fann_cpp.h") i Build All.

Dobra wiadomość:
21:14:03 **** Rebuild of configuration Release for project fanncpptest ****
Info: Internal Builder is used for build
g++ "-IC:\\MinGW\\FANN\\src\\include" -O3 -Wall -c -fmessage-length=0 -o fanncpptest.o "..\\fanncpptest.cpp"
g++ "-LC:\\MinGW\\FANN\\src" -o fanncpptest.exe fanncpptest.o -llibfloatfann
21:14:06 Build Finished. 0 errors, 0 warnings. (took 3s.806ms)

Zła wiadomość:
FANN Wrapper for C++ jest jedynie obiektowym interfejsem do biblioteki napisanej w C i powoduje problemy (uruchom swój przykład lub skompiluj i uruchom xor_sample.cpp i sprawa stanie się jasna). Można poczytać o tym m. in. poniżej:

https://sourceforge.net/p/fann​/discussion/323465/thread​/4eda08c1/
https://sourceforge.net/p/fann​/discussion/323465/thread​/79e654cf/?limit=25
http://leenissen.dk/fann/forum​/viewtopic.php?f=1&t=735​&sid=68f7be1c7e94325adbcfe6e4e5a9f61e

Poza tym metoda create_standard() w dokumentacji uznana jest za przestarzałą (co nie znaczy, że nie powinna działać) i zamiast niej powinno używać się konstruktorów. Więc możesz zacząć się bawić debuggerem albo skorzystać bezpośrednio z C API biblioteki, które po wstępnych oględzinach działa poprawnie.

W razie problemów możesz jeszcze spróbować dodać do systemu następujące zmienne środowiskowe, a jeżeli już tam są to je edytować (ponownie zmieniając ścieżki dostępu na odpowiadające twojej instalacji):

C_INCLUDE_PATH C:\MinGW\FANN\src\include
CPATH C:\MinGW\FANN\src\include
CPLUS_INCLUDE_PATH C:\MinGW\FANN\src\include
LIBRARY_PATH C:\MinGW\FANN\src
OBJC_INCLUDE_PATH C:\MinGW\FANN\src\include

Na marginesie ten ostatni zabieg często się sprawdza przy korzystaniu z bibliotek zewnętrznych i MinGW GCC.
P-176306
Slawek1975
Temat założony przez niniejszego użytkownika
FANN cpp w Eclipse
» 2020-03-03 18:00:02
Dziękuję za zainteresowanie tematem. Właśnie spróbowałem skompilować kod źródłowy w nowo utworzonym projekcie, ale .c i w tym celu we wszystkich plikach źródłowych, musiałem podać pełne ścieżki do includowanych do nich plików np. w pliku floatfann.h:
C/C++
#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\include\config.h"
#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\include\floatfann.h"

#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\fann.c"
#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\fann_io.c"
#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\fann_train.c"
#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\fann_train_data.c"
#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\fann_error.c"
#include "F:\eclipse\Workspace\FANN-2.2.0-Source\src\fann_cascade.c"

Po tym, udało mi się skompilować program w języku "c". Wykasowałem w tym projekcie cały kod "main, łącznie z nagłówkiem main i zmieniłem w zakładce Eclipse->setting->build artifact z executable na static library i ponownie skompilowałem. Wynikową bibliotekę z rozszerzeniem .lib skopiowałem i podałem już w docelowym programie .cpp w zakładce linkera ze ścieżką i nazwą tej mojej własnej biblioteki (libfannLib). Zadziałało, kompilator nie zgłasza błędu:
C/C++
const unsigned int num_layers = 3;
const unsigned int num_input = 2;
const unsigned int num_hidden = 3;
const unsigned int num_output = 1;

FANN::neural_net net;
net.create_standard( num_layers, num_input, num_hidden, num_output );
Próbowałem też uruchomić sieć opartą na openNN, ale wydaje się ona być znacznie bardziej skomplikowana, choć od początku pisana w .cpp .
Postaram się douczyć samodzielnej kompilacji za pomocą cmake.
Chciałem po udanych próbach, sprawdzić, czy da się skompilować i używać FANN dla mikrokontrolera STM32.
P-176312
pekfos
» 2020-03-03 21:49:16
Dołączanie kompilowanych plików takich jak .c czy .cpp przez #include to wielka czerwona flaga. To nigdy nie powinno być potrzebne. Te pliki powinny być tylko dołączone do projektu, w tym wypadku projektu budującego bibliotekę FANN, a projekt programu używającego FANN powinien tylko dołączać do linkera skompilowaną bibliotekę.
P-176313
« 1 »
  Strona 1 z 1