QT undefined reference. Wo trage ich den Linker Pfad ein?

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Nepolo
Beiträge: 10
Registriert: 12. Oktober 2014 18:43

QT undefined reference. Wo trage ich den Linker Pfad ein?

Beitrag von Nepolo »

Hallo ich habe ein kleines Problem.
Es geht wahrscheinlich um einen falschen Pfad.
Ich bin was QT und Linux compilieren angeht noch ein Anfänger.

Ich teste gerade auf die Raspberry Camera in QT zuzugreifen.
Ich habe dazu RaspiCam:C++ API for using Raspberry camera with/without OpenCv installiert.
Jetzt versuche ich das Beispiel auf der Seite mit QT umzusetzen.

Ich bekomme jedoch die folgende Fehlermeldung.
/home/pi/untitled1/main.cpp:12: error: undefined reference to `raspicam::RaspiCam_Cv::RaspiCam_Cv()'

Hier ist der Code untiled1.pro

Code: Alles auswählen

#-------------------------------------------------
#
# Project created by QtCreator 2015-02-23T18:06:00
#
#-------------------------------------------------
QT       += core
QT       -= gui
TARGET = untitled1
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += /usr/local/include/
Hier ist der Code der main.cpp

Code: Alles auswählen

#include <QCoreApplication>
#include <ctime>
#include <iostream>
#include <raspicam/raspicam_cv.h>
using namespace std;
int main(int argc, char *argv[])
{
    time_t timer_begin,timer_end;
    raspicam::RaspiCam_Cv Camera;
    QCoreApplication a(argc, argv);

    return a.exec();
}
So wie ich das verstanden habe, fehlt ein Pfad beim compilieren.
So

Code: Alles auswählen

g++ simpletest_raspicam.cpp -o simpletest_raspicam -I/usr/local/include -lraspicam -lmmal -lmmal_core -lmmal_util
oder so ähnlich.

Wo trägt man den Pfad in QT denn ein ?

Vielen Dank schon mal.
bmann
Beiträge: 14
Registriert: 22. Juni 2006 22:27
Wohnort: Dortmund

Re: QT undefined reference. Wo trage ich den Linker Pfad ein

Beitrag von bmann »

Die Pfade sind in Ordnung, die Libs nicht.
Du benutzt "#include <raspicam/raspicam_cv.h>", also musst du auch gegen die OpenCv Biblothek linken, die raspicam::RaspiCam_Cv::RaspiCam_Cv() enthält.

Du linkst aber (der Zeile die du gepostet hast nach) nur gegen "raspicam" (ohne _cv). Dem Link den du gepostet hast nach brauchst du "-lraspicam -lraspicam_cv", nicht nur "-raspicam". Vermutlich benötigt diese Lib dann ihrerseits die OpenCv Libs, also laut deinem Link " -lopencv_core -lopencv_highgui". Das müsste dann in etwa so aussehen:

Code: Alles auswählen

    g++ simpletest_raspicam.cpp -o simpletest_raspicam -I/usr/local/include -lraspicam -lraspicam_cv -lmmal -lmmal_core -lmmal_util -lopencv_core -lopencv_highgui
Umgekehrt, wenn du OpenCv nicht willst, include die richtige Datei. Deinem Link nach also raspicam/raspicam.h statt raspicam/raspicam_cv.h.
Nepolo
Beiträge: 10
Registriert: 12. Oktober 2014 18:43

Re: QT undefined reference. Wo trage ich den Linker Pfad ein

Beitrag von Nepolo »

Hallo bmann,
Danke für deine Antwort. Ich habe mein Problem wohl nicht genau beschrieben.
Bevor ich mich mit dem Inhalt der Zeile befasse muss ich erst mal wissen was ich mit der Zeile in QT machen soll.
Die Zeile stammt aus dem verlinkten Beispiel oben.
So wie ich das verstanden habe gehört die Zeile in dort Datei CMakeLists.txt.
In dem Beispiel wird das Programm mit Shell Befehlen compiliert.
Ich möchte aber QT nutzen.
Ich vermute das sie irgendwo in die BuildSettings oder unter Build & Run eingetragen wird?
Was mache ich damit? Ich habe die Zeile aus dem obigen verlinkten Beispiel.

Ich habe bis jetzt immer in QT den Button Build Project "Projectname" benutzt.

Vielen Dank schon mal.
bmann
Beiträge: 14
Registriert: 22. Juni 2006 22:27
Wohnort: Dortmund

Re: QT undefined reference. Wo trage ich den Linker Pfad ein

Beitrag von bmann »

Hallo Nepolo,

ich versuche mal zu erraten was du willst... Also "Ich möchte aber QT nutzen" macht in dem Kontext keinen Sinn. Qt ist eine Bibliothek, cmake ist ein Buildsystem. Ich benutze Qt fast auscchließlich mit cmake, das schließt sich nicht aus.

Ich vermute also du möchtest qmake (das Buildsystem das Qt mitbringt) zum bauen verwenden und versuchst jetzt rauszufinden wo du deine Libraries eintragen musst.
Dazu in der .pro Datei eine Zeile der Art hinzufügen:
LIBS += -lraspicam -lraspicam_cv -lmmal -lmmal_core -lmmal_util -lopencv_core -lopencv_highgui

Du schreibst weiter "Ich vermute das sie irgendwo in die BuildSettings oder unter Build & Run eingetragen wird", das lässt nun vermuten, dass du eigentlich QtCreator benutzen möchtest um zu bauen. QtCreator ist eine IDE, die als Build System unter anderem qmake verwenden kann. Wenn du das tust (wonach es aussieht), dann kannst du die "LIBS +=" Zeile ebenfalls manuell in die .pro Datei einfügen, QtCreator wird sie dann benutzen. Ob QtCreator dafür ebenfalls eine graphische Oberfläche bietet kann ich dir grade nicht sagen - ich finde keinen solchen Punkt, allerdings sind die .pro Dateien der Projekte die ich grade hier rumliegen habe drastisch komplizierter, da wäre es dann ohnehin nicht so einfach (sprich: evtl. kann QtCreator das nur bei mir grade nicht).
Nepolo
Beiträge: 10
Registriert: 12. Oktober 2014 18:43

Re: QT undefined reference. Wo trage ich den Linker Pfad ein

Beitrag von Nepolo »

Hallo bmann,
ja ich möchte den QtCreator.
Ich habe unter Options>Build & Run>Qt Versions Qt Version Qt 4.8.2 in PATH (System) /usr/bin/qmake-pt4 eingtragen
Folgendes LIBS += Einträge habe ich auch schon ausprobiert.

Code: Alles auswählen

#-------------------------------------------------
#
# Project created by QtCreator 2015-02-23T18:06:00
#
#-------------------------------------------------
QT       += core
QT       -= gui
TARGET = untitled1
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += /usr/local/include/
LIBS += /usr/local/lib/libopencv_core.so.2.4.10
LIBS += /usr/local/lib/libopencv_highgui.so.2.4.10
LIBS += /usr/local/lib/libopencv_imgproc.so.2.4.10
LIBS += /usr/local/lib/libopencv_features2d.so.2.4.10
LIBS += /usr/local/lib/libopencv_calib3d.so.2.4.10

Vielleicht beschreibe ich mal ganz kurz was ich machen möchte.
Ich möchte mit dem QtCreator ein kleines Programm schreiben.
Ich möchte openCV nutzen. Das hat auch schon geklappt.
Ich habe ein Bild/Video geöffnet und mit openCV verändert. Dazu habe ich die LIBS wie oben im Code hinzugefügt.
Jetzt möchte ich einen Schritt weiter gehen und als Quelle die Rasberry Pi Camera nutzen.
Das ist aber nicht so einfach. Dazu soll man die RaspiCam:C++ API nutzen.
Diese habe ich dann wie auf der verlinkten Seite beschrieben installiert.
Jetzt habe ich mit dem QtCreator eine Qt Console Application erstelle.
Ich habe angefangen Code aus der Beispieldatei einzugeben.
Wenn ich anfange raspicam:: einzugeben bekomme ich eine Autovervollständigung.
Wenn ich wie bis jetzt immer mit den Build Project Button eine ausführbare Datei erstellen will bekommen ich die Fehlermeldungen.
/home/pi/untitled1/main.cpp:12: error: undefined reference to `raspicam::RaspiCam_Cv::RaspiCam_Cv()'
/home/pi/untitled1/main.cpp:12: error: undefined reference to `raspicam::RaspiCam_Cv::~RaspiCam_Cv()'
/home/pi/untitled1/main.cpp:12: error: undefined reference to `raspicam::RaspiCam_Cv::~RaspiCam_Cv()'
collect2:IDd returned 1 exit status

Ich hoffe das du jetzt nicht mehr raten musst.
Viele Grüße Nepolo
Nepolo
Beiträge: 10
Registriert: 12. Oktober 2014 18:43

Re: QT undefined reference. Wo trage ich den Linker Pfad ein

Beitrag von Nepolo »

Hallo bmann,
vielen Dank für deine Hilfe.
Es hat nun geklappt.
Zuerst habe ich deine Zeile noch hinzugefügt.

Code: Alles auswählen

LIBS += -lraspicam -lraspicam_cv -lmmal -lmmal_core -lmmal_util -lopencv_core -lopencv_highgui
Dann bekam ich neue Fehlermeldungen. Die Dateien -lmmal -lmmal_core -lmmal_util konnte nicht gefunden werden.
Ich habe die erst mal raus genommen.

Code: Alles auswählen

LIBS += -lraspicam -lraspicam_cv -lopencv_core -lopencv_highgui
Jetzt kann ich Build Project eine ausführbare Datei erstellen.
Ob ich mmal noch benötige werde ich sehen.


Viele Grüße Nepol
Antworten