2010-02-05 19 views
0

J'essaie d'intégrer du code externe dans mon application. Mon code était pur C, mais le nouveau code est C++, donc j'ai simplement renommé mes fichiers C en .cc et compilé le tout avec g ++.Définition multiple des lots de fonctions std :: lors de la liaison

Il compile très bien, mais je reçois un crapton d'erreurs de lien:

CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator new(unsigned long, void*)': 
svrtH_generator.cc:(.text+0x0): multiple definition of `operator new(unsigned long, void*)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x0): first defined here 
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator new[](unsigned long, void*)': 
svrtH_generator.cc:(.text+0x10): multiple definition of `operator new[](unsigned long, void*)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x10): first defined here 
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator delete(void*, void*)': 
svrtH_generator.cc:(.text+0x20): multiple definition of `operator delete(void*, void*)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x20): first defined here 
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `operator delete[](void*, void*)': 
svrtH_generator.cc:(.text+0x30): multiple definition of `operator delete[](void*, void*)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x30): first defined here 
[you got the idea...] 
svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0xe80): first defined here 
collect2: ld returned 1 exit status 
make[3]: *** [dev/svrt/libsvrt.so] Error 1 
make[2]: *** [dev/svrt/CMakeFiles/svrt.dir/all] Error 2 
make[1]: *** [dev/svrt/CMakeFiles/svrt.dir/rule] Error 2 
make: *** [svrt] Error 2 

J'utilise Cmake pour construire la chose, mais rien de vraiment compliqué. Je ne sais pas pourquoi je reçois toutes ces erreurs, car mon code n'est qu'un tas de méthodes (je n'utilise rien du paquet std) et le code que j'essaie d'intégrer n'est pas beaucoup plus compliqué.

Notez que l'avertissement provient de l'association de mon propre code et pas (encore) du nouveau code C++.

Quelqu'un?

EDIT: après avoir creusé dans le code externe je tente d'intégrer, je l'ai trouvé quelques-uns comprend:

#include <iostream> 
#include <cmath> 
#include <fstream> 
#include <cfloat> 
#include <stdlib.h> 
#include <string.h> 

En outre, iostream est inclus dans d'autres têtes, aussi, et ils ont tous comprennent des gardes. MISE À JOUR: J'ai réussi à nettoyer un peu le code externe et à supprimer les dépendances inutiles. J'ai encore quelques erreurs de l'éditeur de liens, mais beaucoup moins:

CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `std::abs(long)': 
svrtH_generator.cc:(.text+0x0): multiple definition of `std::abs(long)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x0): first defined here 
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `__gnu_cxx::abs(long long)': 
svrtH_generator.cc:(.text+0x20): multiple definition of `__gnu_cxx::abs(long long)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x20): first defined here 
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `__gnu_cxx::div(long long, long long)': 
svrtH_generator.cc:(.text+0x40): multiple definition of `__gnu_cxx::div(long long, long long)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x40): first defined here 
CMakeFiles/svrt.dir/svrtH_generator.cc.o: In function `std::div(long, long)': 
svrtH_generator.cc:(.text+0x350): multiple definition of `std::div(long, long)' 
CMakeFiles/svrt.dir/svrt_generator.cc.o:svrt_generator.cc:(.text+0x150): first defined here 

Le code comprend à la fois cmath et cstdlib, et fait référence à abs et d'autres fonctions en utilisant un espace de noms par défaut. Cela peut-il être le problème?

+0

À quoi ressemble votre code? Comment les en-têtes C++ sont-ils inclus? – jalf

Répondre

0

Enfin, j'ai été capable de faire des choses à compiler. J'ai trouvé quelques indices disant que je devrais me débarrasser des inclusions de style C (#include <stdlib.h>) et les remplacer par C++ inclut des styles (#include <cstdlib>). Cela a fait empirer les choses!

En remettant les inclusions au style .h (et en corrigeant les incohérences à propos de cela dans le code exernal), l'éditeur de liens a été satisfait.

Cela, et en supprimant tout le code inutilisé et comprend du code xternal, résolu mon problème. Merci pour votre aide les gars !

+3

Eh bien, vous ne devriez pas utiliser les versions .h. Ils ne sont pas standard; La méthode standard d'inclusion des en-têtes C est ''. Alors * utilisez * '' et au lieu de dire "ça a empiré", trouvez comment améliorer votre situation globale *. – GManNickG

+0

Je sais! Je ne sais pas pourquoi l'auteur du code externe n'a pas utilisé les en-têtes standard, mais j'ai passé trop de temps à nettoyer/réparer son code. Maintenant que ça marche, j'ai mieux à faire ... – Wookai

3

Vous semblez avoir certaines fonctions nommées new et delete, et ce sont des mots-clés réservés en C++ pour l'allocation de mémoire. Essayez de les renommer en autre chose (svrt_new, svrt_delete par exemple).

également cette ligne est en fait plus d'information:

svrtH_generator.cc:(.text+0x1060): multiple definition of `std::fixed(std::ios_base&)' 

Vous devez inclure en quelque sorte deux versions d'en-têtes iostream ...

+0

En fait, je ne ... toutes mes fonctions sont préfixées de la même manière que ce que vous proposez. – Wookai

0

Cela ressemble un peu comme une situation où vous ne l'avez pas include guards. Mais toutes ces fonctions ressemblent étrangement aux fonctions natives C++. Êtes-vous sûr de ne pas inclure certains en-têtes C++?

+0

J'ai fait les gardes d'inclusion. Et les seuls en-têtes que j'inclus sont les miens ou du nouveau code. Je regarderai plus en profondeur dans le nouveau code pour voir s'ils inclinent un en-tête C++. – Wookai