2008-11-05 16 views
13

Ich habe einige alte C-Code, den ich gerne mit einigen C++ Code kombinieren würde.Iostream Linker Fehler

Der Code C verwendet zu haben, hat folgendes beinhaltet:

#include <windows.h> 
#include <stdio.h> 
#include <string.h> 
#include "mysql.h" 

Jetzt versuche ich es C machen verwenden ++ mit Iostream wie folgt aus:

#include <windows.h> 
#include <stdio.h> 
#include <string> 
#include <iostream> 
#include "mysql.h" 

Aber ich halte die folgende bekommen Linker-Fehler beim Kompilieren:

[Linker Fehler] undefinierter Verweis auf `std :: string :: size() const '

[Linker error] undefiniert Bezugnahme auf `std :: string :: operator [] (unsigned int) const‘

[Linker error] undefiniert Bezugnahme auf `std :: string :: operator [] (unsigned int) const '

[Linker error] undefiniert Bezugnahme auf `std :: string :: operator [] (unsigned int) const'

[Linker error] undefiniert Bezugnahme auf` std :: ios_base :: Init :: Init() '

[Linker Fehler] undefinierter Verweis auf `std :: ios_base :: Init :: ~ Init()'

ld returned 1 exit status

Wie das ich lösen?

Edit: Mein Compiler ist Dev-C++ 4.9.9.2

Antwort

26

Die C string.h Header und die C++ string Header sind nicht austauschbar.

Insgesamt aber Ihr Problem ist, dass die Datei ordnungsgemäß kompiliert wird immer, aber die falsche Laufzeitbibliothek wird in immer verknüpft.

Dev-C++ GCC verwendet. GCC kann die Sprache in einer Datei basierend auf der Dateierweiterung korrekt ermitteln, verlinkt jedoch nicht die rechte Laufzeitbibliothek, sofern Sie nicht explizit nach (-lstdC++ in der Befehlszeile) gefragt werden. Wenn Sie GCC als "g ++" (oder in Ihrem Fall "mingwin32-g ++") aufrufen, erhalten Sie auch die richtige Sprache und verknüpfen die benötigte Bibliothek.

3

Sie müssen gegen Ihre C++ Runtime verknüpfen. Es hängt von Ihrer Plattform und Ihrem Compiler ab, aber das Hinzufügen von -lC zu Ihrer Linkline könnte es tun.

Also möglicherweise Verknüpfung mit Ihrem C++ - Compiler anstelle von ld.

In jedem Fall haben Sie wahrscheinlich eher als ld mit den C++ Compiler zu verknüpfen, wenn Sie Ihre C wollen ++ Code korrekt arbeiten - es oft für Ausnahmen und statische Initialisierer erforderlich ist richtig zu arbeiten ...

+0

Wird '-lc' nicht mit' libc' verknüpft, was eine C-Laufzeitbibliothek ist, nicht C++? Für C++ muss man mit der C++ - Standardbibliothek 'libstdC++' verbinden, indem man den '-lstdC++' -Parameter zu 'gcc' verwendet (oder einfach' g ++ 'benutzt, was automatisch geschieht). Versuchen Sie nicht zu helfen, wenn Sie nicht wissen, wie, weil Sie ebenso gut tun können. – SasQ

+0

Ich habe -lC angegeben, was die C++ - Laufzeit auf einigen Unixen ist, nicht -lc. Mein 2. Absatz besagt auch, dass das OP mit dem C++ - Compiler verknüpfen könnte, der die richtigen Bibliotheken und Einstellungen für die Plattform bereitstellen würde. –

1

Ich habe den gleichen genauen Fehler, wenn ich versuchte, mit Cygwin (g ++) zu kompilieren.

fügen Sie einfach -L/usr/local/bin -L/usr/lib in den Kompilierungsregeln und es sollte funktionieren.

Dies kann spezifisch für Cygwin sein, aber es könnte auch helfen, Ihr Problem zu lösen.