FlyingDoc Geschrieben April 27, 2013 at 21:37 Geschrieben April 27, 2013 at 21:37 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. Zitieren
remotecontrol Geschrieben April 28, 2013 at 08:49 Geschrieben April 28, 2013 at 08:49 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) Zitieren
remotecontrol Geschrieben April 28, 2013 at 09:25 Geschrieben April 28, 2013 at 09:25 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. Zitieren
FlyingDoc Geschrieben April 28, 2013 at 19:38 Autor Geschrieben April 28, 2013 at 19:38 Wo kann ich das einstellen welche Datein mit was compiliert wird? Hab im QT noch nichts gefunden. Zitieren
remotecontrol Geschrieben April 29, 2013 at 05:57 Geschrieben April 29, 2013 at 05:57 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. Zitieren
FlyingDoc Geschrieben April 29, 2013 at 06:41 Autor Geschrieben April 29, 2013 at 06:41 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. Zitieren
remotecontrol Geschrieben April 29, 2013 at 07:33 Geschrieben April 29, 2013 at 07:33 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. Zitieren
photron Geschrieben April 29, 2013 at 09:44 Geschrieben April 29, 2013 at 09:44 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. Zitieren
FlyingDoc Geschrieben April 29, 2013 at 19:51 Autor Geschrieben April 29, 2013 at 19:51 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. Zitieren
remotecontrol Geschrieben April 30, 2013 at 07:22 Geschrieben April 30, 2013 at 07:22 - 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. Zitieren
FlyingDoc Geschrieben May 2, 2013 at 19:03 Autor Geschrieben May 2, 2013 at 19:03 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' Zitieren
FlyingDoc Geschrieben May 2, 2013 at 19:10 Autor Geschrieben May 2, 2013 at 19:10 - 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 Zitieren
photron Geschrieben May 3, 2013 at 08:02 Geschrieben May 3, 2013 at 08:02 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 Zitieren
FlyingDoc Geschrieben May 3, 2013 at 11:39 Autor Geschrieben May 3, 2013 at 11:39 Danke. Das hat noch gefehlt. Jetz kann ich ja umsetzen. Zitieren
FlyingDoc Geschrieben May 3, 2013 at 12:28 Autor Geschrieben May 3, 2013 at 12:28 Vielleicht wäre es angebracht auch für QT eine Beschreibung zu machen. Die jetzige ist ja für Visual Studio. Zitieren
photron Geschrieben May 13, 2013 at 16:41 Geschrieben May 13, 2013 at 16:41 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). Zitieren
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.