Ich habe eine GUI namens UINode und ich möchte ein Duplikat erstellen und nur ein paar Dinge ändern. Das Projekt besteht aus 3 grundlegenden Threads. PingThread, RosThread und der GuiThread. Ich habe versucht, den Projektordner zu kopieren und in UINode2 umzubenennen, aber es gibt mir Fehler, wenn ich versuche, ihn mit catkin_make zu kompilieren. Ich bin mir ziemlich sicher, dass dies Fehler sind, die durch die identischen Header verursacht werden.C++ Qt So erstellen Sie eine Duplikate einer GUI mit kleinen Änderungen
Fehler:
CMakeFiles/drone_gui2.dir/src/UINode/moc_tum_ardrone_gui.cxx.o:moc_tum_ardrone_gui.cxx:(.text+0x0): first defined here CMakeFiles/drone_gui2.dir/src/UINode2/moc_tum_ardrone_gui.cxx.o:(.rodata+0x100): multiple definition of `tum_ardrone_gui::staticMetaObject' CMakeFiles/drone_gui2.dir/src/UINode/moc_tum_ardrone_gui.cxx.o:(.rodata+0x100): first defined here CMakeFiles/drone_gui2.dir/src/UINode2/moc_tum_ardrone_gui.cxx.o: In function `tum_ardrone_gui::qt_metacast(char const*)': moc_tum_ardrone_gui.cxx:(.text+0x20): multiple definition of `tum_ardrone_gui::qt_metacast(char const*)' CMakeFiles/drone_gui2.dir/src/UINode/moc_tum_ardrone_gui.cxx.o:moc_tum_ardrone_gui.cxx:(.text+0x20): first defined here CMakeFiles/drone_gui2.dir/src/UINode2/moc_tum_ardrone_gui.cxx.o: In function `tum_ardrone_gui::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)': moc_tum_ardrone_gui.cxx:(.text+0x70): multiple definition of `tum_ardrone_gui::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)' CMakeFiles/drone_gui2.dir/src/UINode/moc_tum_ardrone_gui.cxx.o:moc_tum_ardrone_gui.cxx:(.text+0x70): first defined here CMakeFiles/drone_gui2.dir/src/UINode2/moc_tum_ardrone_gui.cxx.o: In function `tum_ardrone_gui::qt_metacall(QMetaObject::Call, int, void**)': moc_tum_ardrone_gui.cxx:(.text+0x6f0): multiple definition of `tum_ardrone_gui::qt_metacall(QMetaObject::Call, int, void**)' CMakeFiles/drone_gui2.dir/src/UINode/moc_tum_ardrone_gui.cxx.o:moc_tum_ardrone_gui.cxx:(.text+0x6f0): first defined here
Code:
#include "tum_ardrone_gui.h"
#include "RosThread.h"
#include "PingThread.h"
#include <QtGui>
#include <QApplication>
#include "ros/ros.h"
// this global var is used in getMS(ros::Time t) to convert to a consistent integer timestamp used internally pretty much everywhere.
// kind of an artifact from Windows-Version, where only that was available/used.
unsigned int ros_header_timestamp_base = 0;
int main(int argc, char *argv[])
{
std::cout << "Starting drone_gui Node" << std::endl;
// ROS
ros::init(argc, argv, "drone_gui");
RosThread t;
PingThread p;
// UI
QApplication a(argc, argv);
tum_ardrone_gui w;
// make them communicate with each other
t.gui = &w;
w.rosThread = &t;
p.gui = &w;
p.rosThread = &t;
w.pingThread = &p;
// start them.
t.startSystem();
p.startSystem();
w.show();
// wait until windows closed....
int ec = a.exec();
// stop ROS again....
t.stopSystem();
p.stopSystem();
std::cout << "Exiting drone_gui Node" << std::endl;
return ec;
}
Meine Frage ist: Stellen Sie sich vor ich meine UINode 10 Mal repliziert werden sollen. Muss ich meinen Code fest codieren und Änderungen an jedem Thread-Namen, jeder Klasse usw. vornehmen? Oder gibt es einen besseren Weg?
machst du verschiedene Projekte oder möchtest du diese verschiedenen Knoten im selben Projekt erstellen? – coyotte508
Sie müssen verschiedene Projekte sein (denke ich), weil ich den Pfad jedes Knotens ändern muss, den sie abonnieren und veröffentlichen (Robot1 und Robot2). Aber ich möchte sie kompilieren und gleichzeitig Robot1 mit UINode und Robot2 mit UINode2 steuern. –
Was genau meinen Sie mit "Pfad von jedem Knoten"? Auf dem Dateisystem? Können Sie diese über Kommandozeilenparameter an Ihre Anwendung weitergeben? Dann müssten Sie diese nur noch auswerten, keine zusätzliche Anwendung erstellen müssen ... – Aconcagua