2008-11-05 7 views
13

J'ai un ancien code C que je voudrais combiner avec du code C++.Erreur de lien iostream

Le code C utilisé pour avoir les éléments suivants sont comprend:

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

Maintenant, je suis en train de faire utiliser C++ avec iostream comme ceci:

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

Mais je continue à recevoir les éléments suivants erreurs de l'éditeur de liens lorsque je compile:

[Erreur de lien] Référence non définie à `std :: string :: size() const '

[erreur Linker] de référence définie à `std :: string :: operator [] (unsigned int) const »

[d'erreur Linker] undefined reference to `std :: string :: operator [] (unsigned int) const '

[d'erreur Linker] de référence définie à `std :: string :: operator [] (unsigned int) const'

[d'erreur Linker] undefined reference to` std :: ios_base :: Init :: Init() '

[Erreur de lien] Référence non définie à `std :: ios_base :: Init :: ~ Init()'

ld retourné 1 état de sortie

Comment puis-je résoudre ce problème?

Edit: Mon compilateur est Dev-C++ 4.9.9.2

Répondre

26

Le L'en-tête C string.h et l'en-tête C++ string ne sont pas interchangeables.

Dans l'ensemble, cependant, votre problème est que le fichier est correctement compilé obtenir, mais la bibliothèque d'exécution mal est lié à se.

Dev-C++ utilise GCC. GCC peut déterminer correctement la langue dans un fichier basé sur l'extension de fichier, mais ne liera pas la bonne bibliothèque d'exécution sauf si vous le lui demandez spécifiquement (-lstdC++ sur la ligne de commande). Appeler GCC comme "g ++" (ou, dans votre cas, "mingwin32-g ++") obtiendra aussi la bonne langue et liera la bibliothèque nécessaire.

3

Vous devez établir un lien avec votre runtime C++. Cela dépend de votre plate-forme et de votre compilateur, mais ajouter -lC à votre lien peut le faire.

Il se peut donc que la liaison soit utilisée avec votre compilateur C++ plutôt qu'avec ld.

Dans tous les cas, vous avez probablement un lien en utilisant le compilateur C++ plutôt que ld si vous voulez que votre code C++ fonctionne correctement - il est souvent nécessaire pour les exceptions et les initialiseurs statiques pour fonctionner correctement ...

+0

Le lien '-lc' ne sera-t-il pas lié à' libc' qui est une bibliothèque d'exécution C, pas C++? Pour C++, il faut lier avec C++ Standard Library, 'libstdC++', en utilisant le paramètre '-lstdC++' à 'gcc' (ou simplement en utilisant' g ++ 'qui le fait automatiquement). N'essayez pas d'aider si vous ne savez pas comment, car vous pouvez aussi bien faire un mal. – SasQ

+0

J'ai spécifié -lC, qui est l'exécution de C++ sur certains unix, pas -lc. Mon deuxième paragraphe a également déclaré que l'OP pourrait lier en utilisant le compilateur C++, ce qui fournirait les bibliothèques et les paramètres corrects pour la plate-forme. –

1

J'ai eu la même erreur exacte lorsque j'essayais de compiler avec Cygwin (g ++).

il suffit d'ajouter -L/usr/local/bin -L/usr/lib dans les règles de compilation et cela devrait fonctionner.

Cela peut être spécifique à Cygwin mais cela peut aussi aider à résoudre votre problème.

Questions connexes