Forum: PC-Programmierung Hot to use ML OpenCV


von Open (Gast)


Lesenswert?

Hallo Zusammen,

ich versuche gerade ein Projekt zu compilieren, wo ich gerne mit OpenCV 
ein Beispiel für Maschinelles Lernen ausprobieren möchte.

Es kommen bei Compilieren folgende Fehlermeldungen:


**** Build of configuration Debug for project KNN ****

**** Internal Builder is used for build               ****
g++ -LC:\opencv\build\x86\vc12\lib -oKNN.exe src\KNN.o 
-lopencv_legacy2410 -lopencv_ts2410 -lopencv_core2410 
-lopencv_highgui2410 -lopencv_imgproc2410 -lopencv_ml2410
src\KNN.o: In function `main':
C:\Wascana\C++\KNN\Debug/../src/KNN.cpp:51: undefined reference to 
`CvANN_MLP::CvANN_MLP()'
C:\Wascana\C++\KNN\Debug/../src/KNN.cpp:52: undefined reference to 
`CvANN_MLP_TrainParams::CvANN_MLP_TrainParams()'
C:\Wascana\C++\KNN\Debug/../src/KNN.cpp:63: undefined reference to 
`CvANN_MLP::create(CvMat const*, int, double, double)'
C:\Wascana\C++\KNN\Debug/../src/KNN.cpp:65: undefined reference to 
`CvANN_MLP_TrainParams::~CvANN_MLP_TrainParams()'
C:\Wascana\C++\KNN\Debug/../src/KNN.cpp:65: undefined reference to 
`CvANN_MLP_TrainParams::~CvANN_MLP_TrainParams()'
C:\Wascana\C++\KNN\Debug/../src/KNN.cpp:65: undefined reference to 
`CvANN_MLP::~CvANN_MLP()'
C:\Wascana\C++\KNN\Debug/../src/KNN.cpp:65: undefined reference to 
`CvANN_MLP::~CvANN_MLP()'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 877  ms.

Header Dateien habe ich includet und LIB path in Eclipse hinzugefügt.
Trotztdem geht nicht.

Hat jemand eine Idee, was ich noch da machen muss?

Danke und Grüße

von Klaus W. (mfgkw)


Lesenswert?

Includen ist nur für den Compiler, nicht für den Linker.
Die Fehlermeldung kommt aber vomn Linker, der Compiler ist da schon 
durch.

Der Lib-Path sagt dem Linker, wo er nach Libs suchen soll.
Du musst ihm auch noch sagen, welche Lib er nehmen soll (die er dann im 
Libpath sucht).
Welche das ist, weiß ich nicht - wird wohl mit lib... anfangen und 
irgendwas mit CV heißen.
Wie man die angibt (wenn du weisst, welche es sit), hängt davon ab, mit 
welcher Umgebung du arbeitest.

: Bearbeitet durch User
von Open (Gast)


Lesenswert?

Deine für deine Antwort, aber hat nicht wirklich viel geholfen.
Die libs habe ich auch im Projekt hinzugefügt. Für dieses Beispiel wäre 
dann wihctig opencv_ml2410

-lopencv_legacy2410 -lopencv_ts2410 -lopencv_core2410
-lopencv_highgui2410 -lopencv_imgproc2410 -lopencv_ml2410

von Klaus W. (mfgkw)


Lesenswert?

Ich weiß nicht, mit welcher Umgebung du arbeitest - das macht die Suche 
von außen schwieriger.
Den Pfadnamen nach ist es Windows, aus -l... schließe ich etwas 
gcc-mäßiges?

Da gibt es in der Toolchain vermutlich ein Kommando nm, mit dem man zu 
einer Lib die darin enthaltenen exportierten Symbole anzeigen lassen 
kann (neben vielem anderen).
Damit könntest du mal schauen, ob in den Libs, die du angibst, überhaupt 
die Symbole sind, die der Linker anmeckert.

Bei Visual Studio gab es mal ein dumpbin.exe, das etwas ähnliches macht. 
Bin mir aber nicht sicher, ob das beim VS dabei war oder in irgendeinem 
Resourcekit.

von Eric B. (beric)


Lesenswert?

Open schrieb:
> Deine für deine Antwort, aber hat nicht wirklich viel geholfen.
> Die libs habe ich auch im Projekt hinzugefügt. Für dieses Beispiel wäre
> dann wihctig opencv_ml2410
>
> -lopencv_legacy2410 -lopencv_ts2410 -lopencv_core2410
> -lopencv_highgui2410 -lopencv_imgproc2410 -lopencv_ml2410

LD braucht die Libs in der richtigen Reihenfolge: die "Abhängigen" gehen 
immer vor. Probier z.B. mal opencv_core2410 hinter opencv_ml2410 zu 
stellen (davon aus gehend, dass ml vom core abhängt).
(Alle Angaben ohne Gewähr ;-))

: Bearbeitet durch User
von Open (Gast)


Lesenswert?

Das kann ich ausprobieren.

Kann sein, dass ich alle libs neu erstellen muss?
Ich nutze im Projekt schon fertige libs, die im download für Windows 
vorhanden sind.

von Open (Gast)


Lesenswert?

Ich habe einen Windows Rechner und versuche das Ganze mit 
Eclispe/MinGW/g++ zu erstellen.

von Open (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Ich weiß nicht, mit welcher Umgebung du arbeitest - das macht die
> Suche
> von außen schwieriger.
> Den Pfadnamen nach ist es Windows, aus -l... schließe ich etwas
> gcc-mäßiges?
>
> Da gibt es in der Toolchain vermutlich ein Kommando nm, mit dem man zu
> einer Lib die darin enthaltenen exportierten Symbole anzeigen lassen
> kann (neben vielem anderen).
> Damit könntest du mal schauen, ob in den Libs, die du angibst, überhaupt
> die Symbole sind, die der Linker anmeckert.
>
> Bei Visual Studio gab es mal ein dumpbin.exe, das etwas ähnliches macht.
> Bin mir aber nicht sicher, ob das beim VS dabei war oder in irgendeinem
> Resourcekit.


opencv_ml2410.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 T ??0CvANN_MLP@@QAE@ABV0@@Z
         U __IMPORT_DESCRIPTOR_opencv_ml2410
00000000 I _imp??0CvANN_MLP@@QAE@ABV0@@Z

opencv_ml2410.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 T ??0CvANN_MLP@@QAE@ABVMat@cv@@HNN@Z
         U __IMPORT_DESCRIPTOR_opencv_ml2410
00000000 I _imp??0CvANN_MLP@@QAE@ABVMat@cv@@HNN@Z

opencv_ml2410.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 T ??0CvANN_MLP@@QAE@PBUCvMat@@HNN@Z
         U __IMPORT_DESCRIPTOR_opencv_ml2410
00000000 I _imp??0CvANN_MLP@@QAE@PBUCvMat@@HNN@Z

opencv_ml2410.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 T ??0CvANN_MLP@@QAE@XZ
         U __IMPORT_DESCRIPTOR_opencv_ml2410
00000000 I _imp??0CvANN_MLP@@QAE@XZ

opencv_ml2410.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 T ??0CvANN_MLP_TrainParams@@QAE@UCvTermCriteria@@HNN@Z
         U __IMPORT_DESCRIPTOR_opencv_ml2410
00000000 I _imp??0CvANN_MLP_TrainParams@@QAE@UCvTermCriteria@@HNN@Z

opencv_ml2410.dll:
00000000 I .idata$4
00000000 I .idata$5
00000000 I .idata$6
00000000 T .text
00000000 T ??0CvANN_MLP_TrainParams@@QAE@XZ
         U __IMPORT_DESCRIPTOR_opencv_ml2410
00000000 I _imp??0CvANN_MLP_TrainParams@@QAE@XZ



Symbols sind vorhanden, dazwischen aber Sonderzeichen. Ist es in 
Ordnung?

von Klaus W. (mfgkw)


Lesenswert?

Ja, in den Namen sind ja auch die Signaturen mit versteckt (name 
mangling).

Wenn die Namen also in den Libs definiert und exportiert sind (die mit T 
markierten sind die exportierten Funktionen, U sind die in dieser Lib 
undefinierten, aber vom Linker durch andere Libs aufzulösenden Namen), 
dann wird es an der Reihenfolge der Libs liegen.

von Vlad T. (vlad_tepesch)


Lesenswert?

Eric B. schrieb:
> LD braucht die Libs in der richtigen Reihenfolge: die "Abhängigen" gehen
> immer vor.

Das stimmt nicht.
Die Reihenfolge hat nur Einfluss, wenn Symbole in mehreren libs 
auftauchen. Dann nimmt er die erste gefundene Definition.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.