std::basic_string fehler



  • undefined reference to ´std::basic_string(char, std::char_traits(char), std::allocator(char) )::size() const´

    undefined reference to ´std::basic_string(char, std::char_traits(char), std::allocator(char) )::operator[](unsigned int) const´

    undefined reference to ´std::basic_string(char, std::char_traits(char), std::allocator(char) )::operator[](unsigned int) const´

    undefined reference to ´std::ios_base::Init::Init()undefined reference to ´std::ios_base::Init::~Init()
    collect2: ld gab 1 als Ende-Status Zurük

    kann da irgendjemand was mit anfangen

    danke



  • Wenn du das dazugehörige Programm zeigst, vielleicht.



  • ComPort.cpp

    // ComPort.cpp: Implementierung der Klasse CComPort.

    //#include "stdafx.h"
    #include "COMPort.h"
    #include <stdio.h>
    #include <iostream>

    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    CCOMPort::CCOMPort()
    {
    this->m_fehler= NULL;
    this->m_hPort= 0; //Dateihandle =0
    }

    CCOMPort::~CCOMPort()
    {
    this->Close();
    }
    //öffnet ein serielle Schnittstelle und es können wichtige Parameter der seriellen Schnittstelle gesetzt werden
    BOOL CCOMPort::Init(int iPort, int iBaud, int iSize, int iParity, int stopbit, int fRtsControl, int iTimeout, int iTotalTimeout)
    {
    char port[]= "COM0123456789:"; //"Dateiname"
    sprintf(port, "COM%i:", iPort); //mit Port
    m_hPort = CreateFile( port,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
    if((int)this->m_hPort == -1) //wenn COM?: nicht vorhanden (-1)
    this->m_hPort=0;
    if(this->m_hPort !=0) //Handle ?
    {
    COMMTIMEOUTS comtime; //Timeouts ändern -> schnellere Kommunikation
    GetCommTimeouts(this->m_hPort, &comtime);
    comtime.ReadIntervalTimeout= iTimeout;
    comtime.ReadTotalTimeoutConstant= iTotalTimeout;
    comtime.WriteTotalTimeoutConstant= iTotalTimeout;
    comtime.ReadTotalTimeoutMultiplier=2;
    comtime.WriteTotalTimeoutMultiplier=0;
    SetCommTimeouts(this->m_hPort, &comtime);

    DCB dcb; //Gerätekommunikationsanpassung
    GetCommState(this->m_hPort, &dcb);
    dcb.BaudRate= iBaud;
    dcb.ByteSize= iSize;
    dcb.DCBlength= 28;
    dcb.EofChar= 0;
    dcb.ErrorChar= 0;
    dcb.fRtsControl= fRtsControl;
    dcb.Parity= iParity;
    dcb.StopBits= stopbit;
    dcb.fInX=0;
    dcb.fOutX=0;
    dcb.fAbortOnError= 1;
    SetCommState(this->m_hPort, &dcb);
    return true;
    }

    return false;
    }
    //sendet Daten zur seriellen Schnittstelle
    BOOL CCOMPort::Send(void *puffer, unsigned int len)
    {
    DWORD written= 0;
    if(isOpen())
    {
    WriteFile(this->m_hPort, puffer, len, &written, NULL);
    }
    if(len == written)
    return true;
    return false;
    }
    //holt Daten von der seriellen Schnittstelle
    int CCOMPort::Receive(void puffer, int len)
    {
    DWORD receive=0;
    char
    mich;
    if(m_hPort !=0 && len >0)
    {
    ReadFile(m_hPort, puffer, len, &receive, NULL);
    }
    if(receive==0)
    this->m_fehler= mich;
    return receive;
    }
    //testet ob Zugang zur seriellen Schnittstelle besteht
    BOOL CCOMPort::isOpen()
    {
    if(m_hPort >0)
    return true;
    return false;
    }
    //schließt die serielle Schnittstelle
    BOOL CCOMPort::Close()
    {
    if(isOpen())
    {
    CloseHandle(this->m_hPort);
    this->m_hPort= 0;
    return true;
    }
    return false;
    }

    -------------------------------------------------------------------
    ComPort.h

    #if !defined(toosten_COMPORT_H)
    #define toosten_COMPORT_H

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

    #include <windows.h>

    class CCOMPort
    {
    public:
    CCOMPort();
    ~CCOMPort();
    BOOL Init(int iPort, int Baud =9600, int Size =8, int Parity =0, int stopbit=0, int fRtsControl =2, int Timeout =100, int TotalTimeout =1000);
    BOOL Send(void *PUFFER, unsigned int nBYTES);
    int Receive(void PUFFER, int MAXBYTES);
    BOOL isOpen();
    BOOL Close();
    private:
    char
    m_fehler;
    HANDLE m_hPort;
    };

    #endif // !defined(toosten_COMPORT_H)

    ----------------------------------------------------------------------------
    sendstream.cpp
    /*
    Sends a stream to the MMDS where it will be broadcast

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/stat.h>
    #include "COMPort.h"
    //#include "slideshow.h"

    #ifdef LINUX
    #include <unistd.h>
    #endif

    #define MIN(a,b) (((a)<(b))?(a):(b))

    int main (int argc, char **argv)
    {
    char *host = NULL;
    char *provider = NULL;
    int port = 10000;
    char *path = NULL;
    int framesize;
    int handle;
    //CCOMPort Neu;
    return 0;
    }

    Die untere Klasse soll COmport einbinden. Die Fehlermeldungen kommen,wenn ich beide

    gcc sendstream.o COMPort.o -o sendstream.exe -lwsock32

    Beim EInzel Kompilieren kommt keine meldung



  • // ComPort.cpp: Implementierung der Klasse CComPort.
    
    //#include "stdafx.h"
    #include "COMPort.h"
    #include <stdio.h>
    #include <iostream>
    
    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    CCOMPort::CCOMPort()
    {
    	this->m_fehler= NULL;
    	this->m_hPort= 0;						//Dateihandle =0
    }
    
    CCOMPort::~CCOMPort()
    {
    	this->Close();							
    }
    //öffnet ein serielle Schnittstelle und es können wichtige Parameter der seriellen Schnittstelle gesetzt werden
    BOOL CCOMPort::Init(int iPort, int iBaud, int iSize, int iParity, int stopbit, int fRtsControl, int iTimeout, int iTotalTimeout)
    {
    	char port[]= "COM0123456789:";			//"Dateiname"
    	sprintf(port, "COM%i:", iPort);			//mit Port
    	m_hPort = CreateFile(	port, 
    		GENERIC_READ | GENERIC_WRITE, 
    		0, 
    		NULL, 
    		OPEN_EXISTING,
    		FILE_ATTRIBUTE_NORMAL, 
    		NULL);
    	if((int)this->m_hPort == -1)			//wenn COM?: nicht vorhanden (-1)
    			this->m_hPort=0;
    	if(this->m_hPort !=0)					//Handle ?
    	{
    		COMMTIMEOUTS comtime;				//Timeouts ändern -> schnellere Kommunikation
    		GetCommTimeouts(this->m_hPort, &comtime);
    		comtime.ReadIntervalTimeout= iTimeout;
    		comtime.ReadTotalTimeoutConstant= iTotalTimeout;
    		comtime.WriteTotalTimeoutConstant= iTotalTimeout;
    		comtime.ReadTotalTimeoutMultiplier=2;
    		comtime.WriteTotalTimeoutMultiplier=0;
    		SetCommTimeouts(this->m_hPort, &comtime);
    
    		DCB dcb;							//Gerätekommunikationsanpassung
    		GetCommState(this->m_hPort, &dcb);
    		dcb.BaudRate= iBaud;
    		dcb.ByteSize= iSize;
    		dcb.DCBlength= 28;
    		dcb.EofChar= 0;
    		dcb.ErrorChar= 0;
    		dcb.fRtsControl= fRtsControl;
    		dcb.Parity= iParity;
    		dcb.StopBits= stopbit;
    		dcb.fInX=0;
    		dcb.fOutX=0;
    		dcb.fAbortOnError= 1;
    		SetCommState(this->m_hPort, &dcb);
    		return true;
    	}
    
    	return false;
    }
    //sendet Daten zur seriellen Schnittstelle
    BOOL CCOMPort::Send(void *puffer, unsigned int len)
    {
    	DWORD written= 0;						
    	if(isOpen())
    	{										
    		WriteFile(this->m_hPort, puffer, len, &written, NULL);
    	}
    	if(len == written)						
    		return true;
    	return false;
    }
    //holt Daten von der seriellen Schnittstelle
    int CCOMPort::Receive(void *puffer, int len)
    {
    	DWORD receive=0;
    	char* mich;
            if(m_hPort !=0 && len >0)
    	{
    		ReadFile(m_hPort, puffer, len, &receive, NULL);
    	}
    	if(receive==0)
    		this->m_fehler= mich;
    	return receive;
    }
    //testet ob Zugang zur seriellen Schnittstelle besteht
    BOOL CCOMPort::isOpen()
    {
    	if(m_hPort >0)
    		return true;
    	return false;
    }
    //schließt die serielle Schnittstelle
    BOOL CCOMPort::Close()
    {
    	if(isOpen())
    	{
    		CloseHandle(this->m_hPort);
    		this->m_hPort= 0;	
    		return true;
    	}
    	return false;
    }
    
    -------------------------------------------------------------------
    ComPort.h
    
    #if !defined(toosten_COMPORT_H)
    #define toosten_COMPORT_H
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include <windows.h>
    
    class CCOMPort  
    {
    public:
    	CCOMPort();										
    	~CCOMPort();
    	BOOL Init(int iPort, int Baud =9600, int Size =8, int Parity =0, int stopbit=0, int fRtsControl =2, int Timeout =100, int TotalTimeout =1000); 
    	BOOL Send(void *PUFFER, unsigned int nBYTES);		
    	int Receive(void *PUFFER, int MAXBYTES);		
    	BOOL isOpen();	
    	BOOL Close();
    private:
    	char* m_fehler;
    	HANDLE m_hPort;
    };
    
    #endif // !defined(toosten_COMPORT_H)
    
    ----------------------------------------------------------------------------
    sendstream.cpp
    /*
      Sends a stream to the MMDS where it will be broadcast
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/stat.h>
    #include "COMPort.h"
    //#include "slideshow.h"
    
    #ifdef LINUX
    #include <unistd.h>
    #endif
    
    #define MIN(a,b) (((a)<(b))?(a):(b))
    
    int main (int argc, char **argv)
    {
      char *host = NULL;
      char *provider = NULL;
      int port = 10000;
      char *path = NULL;
      int framesize;
      int handle;
     //CCOMPort Neu;
    return 0;
    }
    


  • Das Problem ist ja auch wenn ich dann

    CCOMPort Neu;

    eingebe

    erscheintn folgende medung

    sendstream.o:sendstream.cpp:(.text+0x4ba): undefined reference to \_\_\_gxx\_personality_sj0' sendstream.o:sendstream.cpp:(.text+0x512): undefined reference toCCOMPort::CCOMPort()'
    sendstream.o:sendstream.cpp:(.text+0x934): undefined reference to CCOMPort::~CCOMPort()' sendstream.o:sendstream.cpp:(.text+0x967): undefined reference toCCOMPort::~CCOMPort()'
    collect2: ld gab 1 als Ende-Status zur"uck



  • Wo genau verwendest du eigentlich iostream's oder string's? (beim ersten Überblick habe ich nichts gesehen)

    Zu den Meldungen über CCOMPort::CComPort() - die treten auf, weil du die ComPort-Klasse nicht mit an den Linker übergeben hast.



  • Wie übergeb ich sie andem linker??

    und zu dem Rest:

    ich hab den include der iostream weggelassen und schon muckt er nicht mehr

    das wars wohl

    aber



  • Eigentlich sollte es gehen, wenn du dem Compiler alle beteiligten CPP's mitgibst.



  • Hat hingehaun..Jetzt bleibt noch die fehlermeldung
    sendstream.o:sendstream.cpp:(.text+0x4ba): undefined reference to `___gxx_personality_sj0'



  • Der Fehler komtm wenn ich jetzt auch ein Objekt deklariereen möchte

    CCOMPort Neu;



  • Der Ausdruck sieht insgesamt folgendeer Maßenb aus, wenn ich

    CCOMPort Neu;

    deklariere:

    sendstream.o:sendstream.cpp:(.text+0x4ba): undefined reference to `___gxx_personality_sj0'
    collect2:ld gab 1 als ENDE-Statud zurück

    Danke



  • Samuela schrieb:

    Der Ausdruck sieht insgesamt folgendeer Maßenb aus, wenn ich

    CCOMPort Neu;

    deklariere:

    sendstream.o:sendstream.cpp:(.text+0x4ba): undefined reference to `___gxx_personality_sj0'
    collect2:ld gab 1 als ENDE-Statud zurück

    Danke

    Das ist nicht nur eine Deklaration sondern auch eine Definition; hier wird implizit der Standardkonstriktor von CCOMPort aufgerufen, wie ich bereits geschrieben hatte.

    Wenn Du mit dem gcc arbeitest solltest Du zum Linken g++ aufrufen; dann werden die richtigen libs hinzugebunden.

    Allgemein vermute ich dass Du einfach

    gcc sendstream.cpp
    

    aufrufst.
    Das ist zu wenig; Du musst ertmal alle Dateien kompilieren und dann die Module Binden.

    gcc -c sendstream.cpp
    gcc -c COMPort.cpp
    g++ sendstream.o ComPort.o -o a.out
    

    Dessweiteren sollte man _NICHT_ <string.h> verwenden, schon gar nicht zusammen mit <iostream> verwenden;
    der neue header heisst einfach <string>

    Grüsse

    *this



  • Gast++ schrieb:

    _NICHT_ <string.h> verwenden,

    aber das brauch ich doch für strcpy LOL



  • Es funktioniert danke,danke,danke



  • Der neue Header anstelle von string.h heißt cstring und sollte natürlich verwendet werden.



  • Braunstein schrieb:

    Der neue Header anstelle

    Wenn Du schon Spass daran hast meine Beiträge zu lektorieren, dann bitte richtig - "anstelle von " war dan irgends zu lesen.

    Stell mal eine Hypothese auf, warum die OP <string.h> inkludiert und dann lies das es nochmal durch.

    Braunstein schrieb:

    von steht doch steht doch
    string.h heißt cstring und sollte natürlich verwendet werden.

    Von "sollen" kann da ohne weiteres gar keine Rede sein.
    Verwenden "soll" man wol eher <string> und auf C-Strings verzichten.

    Dass ist immer das Problem mit Hobby-Lektoren in Foren; Aussagen aus dem Kontext zu reissen bringt ja vielleicht intellektuelle Genugtuung aber lösst nicht das Problem des OP.
    Mir erscheint das immer als Überkompensation von Kommunikationsd3efiziten der "Lektoren". Es st kein Zeichen von Intelligenz etwas nicht zu verstehen.

    Problemlösend arbeiten meist die Autoren, nicht die Lektoren.
    Lösungskompetenz wird zum Glück besser bezahlt.

    Grüsse

    *this



  • Es war folgendes zu lesen

    Dessweiteren sollte man _NICHT_ <string.h> verwenden, schon gar nicht zusammen mit <iostream> verwenden;
    der neue header heisst einfach <string>

    Daraus habe ich entnommen, dass du die Verwendung von string statt string.h empfiehlst (was falsch ist). Daraus ist nicht zu ersehen, dass du eigentlich die Verwendung von std::string statt char* meinst.
    Ich habe also nichts aus dem Kontext gerissen, du bist nur ziemlich empfindlich. 😉



  • Braunstein schrieb:

    Es war folgendes zu lesen

    Dessweiteren sollte man _NICHT_ <string.h> verwenden, schon gar nicht zusammen mit <iostream> verwenden;
    der neue header heisst einfach <string>

    Daraus habe ich entnommen, dass du die Verwendung von string statt string.h empfiehlst (was falsch ist).

    Nein, das ist sogar sehr richtig - die Verwendung von string ist der Verwendung von string.h vorzuziehen.
    Es sei denn man man Zeigerarithmetik.

    Braunstein schrieb:

    Daraus ist nicht zu ersehen,

    Was Du ersehen kannst ist gewiss kein Massstab. Ganz offensichtlich nicht.

    Braunstein schrieb:

    dass du eigentlich die Verwendung von std::string statt char* meinst.

    Du implizierst etwas albern.

    Braunstein schrieb:

    Ich habe also nichts aus dem Kontext gerissen, du bist nur ziemlich empfindlich. 😉

    Ist das Deine praktische Übung zu "Polemik für Dummies"?

    Grüsse

    *this


Anmelden zum Antworten