Jump to content

Recommended Posts

Geschrieben

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.

Geschrieben
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)

Geschrieben

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.

Geschrieben

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.

Geschrieben

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. :P

Geschrieben

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.

screen.png.aa61a853d702dd38f339c1df5c933b7e.png

Geschrieben

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.

 

 

 

Geschrieben

Also ich habe die Binding Dateien jetzt mal in cpp umbenannt.

Ergebnic.

Der dusselige Fehler kommt jetzt bei genau diesen Dateien beim Compilieren. :o

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.

Geschrieben

- 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.

screen1.thumb.png.c3e574a69f815cd533ca445150ca693f.png

Geschrieben

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'

Geschrieben

 

- 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

 

  • 2 weeks later...
Geschrieben

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...