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
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.
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
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.
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 ;-))
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.
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?
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.
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.