FlyingDoc Posted April 27, 2013 at 09:37 PM Posted April 27, 2013 at 09:37 PM Mein Projekt habe ich bis jetzt ja mit QTPlugin zum Visual Studio geschrieben. Da funktioniert ja auch alles. Da ich es ja aber auf dem PI laufen lassen will habe ich mir das Komplette QT mit Creator geladen und will das Projekt jetzt portieren. Leider bringt es mir beim Compilieren Fehler sobald ich die Includes von TF einbringe. Der Fehler ist immer gleich. C:\Software\QT Projekte\HUD\main.cpp:147: Fehler:undefined reference to `ipcon_connect(_IPConnection*, char const*, unsigned short)' Vielleicht kann mir jemand einen Tipp geben. Quote
remotecontrol Posted April 28, 2013 at 08:49 AM Posted April 28, 2013 at 08:49 AM sobald ich die Includes von TF einbringe Das main.cpp ruft aber ipcon_connect schon auf - oder nicht? Das hier ist ein klassischer Linkfehler, der kann auf zwei Arten entstehen: 1) Du linkst die TF Objects nicht hinzu: was steht in Deinem Solution-File / Makefile an Linkoptionen? Sind TF Objects mit dabei? 2) die TF Sourcen sind im C-Mode compiliert, Deine main.cpp aber im C++ Mode, dann ist das Name-Mangling der Funktionen anders. 2) kann entstehen, da die TF-Sourcen die Endung ".c" haben. Je nach Compiler kann der dann in den C-Mode gehen und dann entsteht im Object-File eine Funktion _ipcon_connect (also ohne diese Argumentliste im Namen und '_' am Anfang). Die main.cpp wird aber als C++ compiliert und sucht nach einer ipcon_connect-Methode mit C++ Name Mangling. Prüfe mal die Compile-Ausgabe beim Übersetzen der TF-Sourcen: hier sollte /Tp verwendet werden, um dem Compiler die Source als C++ Source zu übergeben (siehe auch http://msdn.microsoft.com/de-de/library/vstudio/fwkeyyhe.aspx) Quote
remotecontrol Posted April 28, 2013 at 09:25 AM Posted April 28, 2013 at 09:25 AM Sorry - den Titel sollte man auch lesen ... Bei Mingw müsstest Du ja ein Makefile haben. Dann musst Du zum einen drauf achten, dass die TF Sourcen mit g++ übersetzt sind (nicht gcc) und beim Linken der Main müssen die TF-Objects mit in der Linkliste drin sein. Quote
FlyingDoc Posted April 28, 2013 at 07:38 PM Author Posted April 28, 2013 at 07:38 PM Wo kann ich das einstellen welche Datein mit was compiliert wird? Hab im QT noch nichts gefunden. Quote
remotecontrol Posted April 29, 2013 at 05:57 AM Posted April 29, 2013 at 05:57 AM Ich hab' den QT Creator noch nicht benutzt, aber die erste wichtige Frage ist: werden die TF Sourcen überhaupt übersetzt? Wenn nein müssen die erstmal dem Projekt hinzugefügt werden. Wenn ja und es ist nirgends in den Einstellungen und den Makefiles was von 'gcc' zu finden würde ich die Sourcen mal auf die Endung .cpp umbenennen. Quote
FlyingDoc Posted April 29, 2013 at 06:41 AM Author Posted April 29, 2013 at 06:41 AM Ich habe es so oder so probiert. DIe Klasse kann ich einbinden. Nur wenn ich dann eine Funktion daraus aufrufen will kommt halt dieser Fehler. Im Editor zeigt er mir ja sogar die Funktionsaufrufparameter mit an. Nur der Compiler eben spielt Mimose. Quote
remotecontrol Posted April 29, 2013 at 07:33 AM Posted April 29, 2013 at 07:33 AM Ich habe mir mal den QTCreator (auf Linux) installiert: - die TF-Sourcen liegen bei mir im Unterverzeichnis "bindings" - im .pro-File habe ich als Include-Verzeichnis "bindings" ergänzt - add-hoc habe ich auch nichts gefunden, um den Compiler für C-Sourcen von gcc auf g++ zu ändern. Editieren des generierten Makefiles hilft nicht. - Compiliere ich das so ohne Änderungen bekomme ich den gleichen Linkfehler wie Du, aber sehe auch, dass "gcc" verwendet wird, nicht g++ Ich habe jetzt alle Sourcen von .c nach .cpp umbenannt und das Projekt-File bereinigt, damit dort nur noch die cpp drin stehen => dann linkt es ohne Fehler. Hast Du die TF-Sourcen wirklich umbenannt? Anbei noch ein Screenshot, wie meine Projektdatei aussieht. Quote
photron Posted April 29, 2013 at 09:44 AM Posted April 29, 2013 at 09:44 AM Das Umbenennen von *.c nach *.cpp ist denke ich die einfachste und beste Weise um die Bindings in C++ zu verwenden. Dann passt auch das Name Mangling automatisch usw. Ich nehme das mal als empfohlenes Vorgehen für C++ in die Dokumentation auf. Quote
FlyingDoc Posted April 29, 2013 at 07:51 PM Author Posted April 29, 2013 at 07:51 PM Also ich habe die Binding Dateien jetzt mal in cpp umbenannt. Ergebnic. Der dusselige Fehler kommt jetzt bei genau diesen Dateien beim Compilieren. Und wenn ich sie aus der Liste rauslasse und nur den Inlude aufrufe kommt der alte Fehler wieder. Übrigends ist das Projet als QT mit GUI deklariert. Quote
remotecontrol Posted April 30, 2013 at 07:22 AM Posted April 30, 2013 at 07:22 AM - Zeigt das Projekt in der TreeView auch die CPP-Dateien an? (ich musste die manuell neu aufnehmen nach dem Umbenennen) - Die Projekt-Datei hast Du angepasst bzw. hat nur noch die CPPs? - Wie sieht die Compiler-Ausgabe aus, wenn Du erst alles bereinigst und dann neu bauen lässt. Ich habe nochmal einen Screenshot des Compilers angehängt: hier sieht man, dass erst alle Sourcen mit g++ übersetzt werden und ganz am Ende kommt der Link-Schritt. Quote
FlyingDoc Posted May 2, 2013 at 07:03 PM Author Posted May 2, 2013 at 07:03 PM Sorry das ich erst heute antworte. Es hat mich niedergeschnupft. Hab zwar reingeschaut aber nichts gemacht. Hier mal ein Ausdruck der Ausgabe meines Testprogrammes. #------------------------------------------------- # # Project created by QtCreator 2013-04-29T22:43:39 # #------------------------------------------------- QT += core QT -= gui TARGET = HUDTest2 CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp \ ip_connection.cpp HEADERS += \ ip_connection.h #include <QCoreApplication> #include <stdio.h> #include <math.h> #include <string.h> #include <mbstring.h> #include <malloc.h> #include <stdint.h> #include "ip_connection.h" IPConnection* ipcon = NULL; #define MAX_STRING 255 struct coordinates { float x; float y; float z; float w; }COORDINATES; struct Quaternion { double w, x, y, z; }; struct Euler { double yaw,pitch,roll; }; int16_t pitch = 0; int16_t roll = 0; int16_t yaw = 0; int16_t heading = 0; coordinates *base_coordinates; float base_x = 0; float base_y = 0; float base_z = 0; float base_w = 0; char* Programmpath= NULL; char* HOST = NULL; int PORT = 4223; // Demon Standardport int Periode = 100; int IMUPeriode = 250; int GPSPeriode = 1000; char* UID = NULL; char AI_Speed; char* AI_Speed_con_uid = NULL; char AI2_Voltage; char* AI2_Voltage_con_uid = NULL; float pi = M_PI; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Programmpath = (char *)malloc((MAX_STRING) * sizeof(char)); strcpy(Programmpath, argv[0]); base_coordinates = new coordinates(); base_coordinates->x = 55; base_coordinates->y = 0; base_coordinates->z = 0; base_coordinates->w = 0; HOST = (char *)malloc((MAX_STRING) * sizeof(char)); // strcpy(HOST, "localhost"); // strcpy(HOST, "programm64"); strcpy(HOST, "nbruppelt"); AI_Speed_con_uid = (char *)malloc((MAX_STRING) * sizeof(char)); strcpy(AI_Speed_con_uid, "5WpMpP"); AI_Speed = 'a'; AI2_Voltage_con_uid = (char *)malloc((MAX_STRING) * sizeof(char)); strcpy(AI2_Voltage_con_uid, "5WpMpP"); AI2_Voltage = 'd'; if( argc > 1 ) { for( int i = 1; i < argc; i++ ) { _strlwr( argv[i] ); unsigned char* Test1; Test1 = (unsigned char*)argv[i]; unsigned char* Test2 = (unsigned char*)"?"; if(_mbsnbcmp(Test1,Test2,1)==0) { fprintf(stderr, "\nTest.exe -Host Hostname -Port XXX -Periode XXX\"\n\n\t-Host Hostname\tIP or computername on that of the BRICK Demaon runs ( Default localhost )\n\t-Port XXX\tPort with that of the BRICK Demaon runs ( Default 4223 )\n\t-Periode XXX\tCycle period ( Default 100 )\n"); // exit( 1 ); } Test2 = (unsigned char*)"-host"; if(_mbsnbcmp(Test1,Test2,5)==0) { strcpy(HOST, argv[i+1]); } Test2 = (unsigned char*)"-port"; if(_mbsnbcmp(Test1,Test2,5)==0) { PORT = atoi(argv[i+1]); } Test2 = (unsigned char*)"-period"; if(_mbsnbcmp(Test1,Test2,5)==0) { Periode = atoi(argv[i+1]); } } } /****************************************************************************/ /* IPConnection erstellen */ /****************************************************************************/ if(!ipcon) { ipcon = new IPConnection(); } // ipcon_create(ipcon); if(ipcon) { if(ipcon_connect(ipcon, HOST, PORT) < 0) { fprintf(stderr, "Could not create connection\n"); } // exit(1); } // printf("Test %s\t %d\n",HOST, PORT); /****************************************************************************/ /* Komponenten (Bricks,Bricklets) abfragen */ /****************************************************************************/ // ipcon_register_callback(ipcon,IPCON_CALLBACK_ENUMERATE,(void *)cb_enumerate,NULL); // ipcon_enumerate(ipcon); return a.exec(); } 20:57:16: Führe Schritte für Projekt HUDTest2 aus... 20:57:16: Unveränderte Konfiguration, qmake-Schritt wird übersprungen. 20:57:17: Starte "C:\Software\Qt\Qt5.0.1\Tools\MinGW\bin\mingw32-make.exe" C:/Software/Qt/Qt5.0.1/Tools/MinGW/bin/mingw32-make -f Makefile.Debug mingw32-make[1]: Entering directory 'C:/Software/QT Projekte/HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug' g++ -Wl,-subsystem,console -mthreads -o debug\HUDTest2.exe debug/main.o debug/ip_connection.o -LC:\Software\Qt\Qt5.0.1\5.0.1\mingw47_32\lib -lQt5Cored debug/ip_connection.o: In function `socket_create': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:155: undefined reference to `_imp__socket@12' C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:162: undefined reference to `_imp__setsockopt@20' C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:163: undefined reference to `_imp__closesocket@4' debug/ip_connection.o: In function `socket_destroy': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:172: undefined reference to `_imp__closesocket@4' debug/ip_connection.o: In function `socket_connect': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:176: undefined reference to `_imp__connect@12' debug/ip_connection.o: In function `socket_shutdown': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:180: undefined reference to `_imp__shutdown@8' debug/ip_connection.o: In function `socket_receive': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:184: undefined reference to `_imp__recv@16' C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:189: undefined reference to `_imp__WSAGetLastError@0' debug/ip_connection.o: In function `socket_send': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:200: undefined reference to `_imp__send@16' debug/ip_connection.o: In function `ipcon_connect_unlocked': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:1312: undefined reference to `_imp__gethostbyname@4' C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:1322: undefined reference to `_imp__htons@4' debug/ip_connection.o: In function `Z13ipcon_connectP13_IPConnectionPKct': C:\Software\QT Projekte\HUDTest2-build-Desktop_Qt_5_0_1_MinGW_32bit-Debug/../HUDTest2/ip_connection.cpp:1564: undefined reference to `_imp__WSAStartup@820:57:31: Der Prozess "C:\Software\Qt\Qt5.0.1\Tools\MinGW\bin\mingw32-make.exe" wurde mit dem Rückgabewert 2 beendet. Error while building/deploying project HUDTest2 (kit: Desktop Qt 5.0.1 MinGW 32bit) Bei der Ausführung von Schritt 'Make' Quote
FlyingDoc Posted May 2, 2013 at 07:10 PM Author Posted May 2, 2013 at 07:10 PM - Zeigt das Projekt in der TreeView auch die CPP-Dateien an? (ich musste die manuell neu aufnehmen nach dem Umbenennen) Ja werden angezeigt - Die Projekt-Datei hast Du angepasst bzw. hat nur noch die CPPs? Ja - Wie sieht die Compiler-Ausgabe aus, wenn Du erst alles bereinigst und dann neu bauen lässt. Ich habe nochmal einen Screenshot des Compilers angehängt: hier sieht man, dass erst alle Sourcen mit g++ übersetzt werden und ganz am Ende kommt der Link-Schritt. Siehe oben Quote
photron Posted May 3, 2013 at 08:02 AM Posted May 3, 2013 at 08:02 AM Die Undefined Reference Fehler die du da noch hast beziehen sich alle auf WinSock2. Du musst noch wie hier beschriebene geben die ws2_32.dll linken: http://www.tinkerforge.com/de/doc/Software/API_Bindings_C.html#gcc Dafür fügst du in deine .pro Datei folgende Zeile ein: LIBS += -lws2_32 Quote
FlyingDoc Posted May 3, 2013 at 11:39 AM Author Posted May 3, 2013 at 11:39 AM Danke. Das hat noch gefehlt. Jetz kann ich ja umsetzen. Quote
FlyingDoc Posted May 3, 2013 at 12:28 PM Author Posted May 3, 2013 at 12:28 PM Vielleicht wäre es angebracht auch für QT eine Beschreibung zu machen. Die jetzige ist ja für Visual Studio. Quote
photron Posted May 13, 2013 at 04:41 PM Posted May 13, 2013 at 04:41 PM Es gibt jetzt auch welche für Qt Creator. Der Hinweis auf den Workaround für den GCC 4.7 Bug aus dem anderen Thread fehlt da mit Absicht. Ich habe noch einen anderen Workaround gefunden, der ohne Zutun des Nutzers funktioniert und Teil der nächsten C/C++ Bindings Version sein wird (er befindet sich schon im git). Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.