2016-11-03 4 views
0

J'ai un projet C++ qui fait référence aux fichiers .h et .cpp de la bibliothèque (ACE_TAO). (http://www.theaceorb.com/)Eclipse C++ Référencement de la bibliothèque externe (ACE + TAO)

J'ai inclus les chemins de bibliothèque au compilateur GCC C++ du projet et au lieur GCC C++. Cependant, lorsque j'essaie de créer mon projet, je continue à recevoir une erreur.

undefined reference to ACE_Message_Block::~ACE_Message_Block() 
    | line 627 external location /home/user/Documents/ACE_wrappers/ace/CDR_Stream.inl 

undefined reference to CORBA::ORB~ORB(); 
    | line 45 external location /home/user/Documents/ACE_wrappers/Tao/tao/ORB.inl 

J'ai inclus le fichier d'en-tête droite Voici mon propre fichier d'en-tête du projet

#ifndef MESSENGERSERVER_H_ 
#define MESSENGERSERVER_H_ 
#include <tao/ORB.h> // this is causing the error 

class MessengerServer { 
public: 
    MessengerServer(); 
    virtual ~MessengerServer(); 
private: 
    CORBA::ORB_var orb; // this is causing the error 

1) et éclipse est en mesure de résoudre le fichier d'en-tête, donc cela doit vouloir dire que mes chemins de la bibliothèque est correcte droite?

2) Si les chemins de ma bibliothèque sont corrects, pourquoi eclipse est incapable de lier les fichiers .cpp pour l'implémentation des 2 méthodes? mes fichiers .h et .cpp sont dans le même répertoire de dossiers. 3) Je pensais que c'était peut-être parce que je n'ai pas les fichiers .o dans les chemins de la bibliothèque, donc j'ai lancé 'make' et généré les fichiers .o dans le même répertoire, mais j'ai toujours la même erreur .

Ai-je manqué/mal compris quelque chose? Merci d'avance.

mise à jour: est ici la commande Eclipse C++ utilisé pour construire mon projet

g++ -I/home/user/Documents/ACE_wrappers/TAO/ 
-I/home/user/Documents/ACE_wrappers/ace/ 
-I/home/user/Documents/ACE_wrappers/ 
-O0- g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"myMain.d" -MT"myMain.d" -o"myMain.o" "../myMain.cpp" 
Finished Building:../MyMain.cpp 

g++ -I/home/user/Documents/ACE_wrappers/TAO/ 
-I/home/user/Documents/ACE_wrappers/ace/ 
-I/home/user/Documents/ACE_wrappers/ 
-O0- g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"MyServer.d" -MT"MyServer.d" -o"MyServer.o" "../MyServer.cpp" 
Finished Building:../MyServer.cpp 

g++ -L/home/user/Documents/ACE_wrappers/TAO/ 
-L/home/user/Documents/ACE_wrappers/ace/ 
-L/home/user/Documents/ACE_wrappers/ 
-o "TAOServer" ./myMain.o ./MyServer.o 
./MyMain.o: In function 'ACE_InputCDR:~ACE_InputCDR()': 
/home/user/Documents/ACE_wrappers/ace/CDR_Stream.inl:627: undefined reference to ACE_Message_Block::~ACE_Message_Block() 
./MyServer.o: In function 'CORBA::ORB:decr_refcount()': 
/home/user/Documents/ACE_wrappers/Tao/tao/ORB.inl:45: undefined reference to CORBA::ORB~ORB(); 

Répondre

0

La liaison est défaillante. Non, votre chemin "include" détermine si vous pouvez trouver un fichier d'en-tête. Le chemin "bibliothèque" est utilisé pour la liaison avec les fichiers objets ou les fichiers de bibliothèque. La liaison ne fonctionne pas.

Les fonctions manquantes sont les destructeurs pour les classes ACE_Message_Block et ORB. Trouvez les fichiers source pour eux, compilez-les et assurez-vous que les fichiers objets compilés sont sur le chemin de la bibliothèque pour votre projet.

+0

J'ai compilé les fichiers source dans/home/user/Documents/ACE_wrappers/ace/et/home/user/Documents/ACE_wrappers/Tao/tao /, et j'ai ajouté les deux à mon chemin de bibliothèque. Je vois des objets .o pour ACE_Message_Block et ORB. Mais j'ai toujours reçu la même erreur –

+0

Vérifiez également que vous avez spécifié les bibliothèques sur la ligne de commande. Voir ici: http://stackoverflow.com/questions/22426574/gcc-undefined-reference-to. Si vous ne spécifiez pas de bibliothèques par nom et chemin, assurez-vous que la bibliothèque elle-même, chemin complet, est également incluse dans la ligne de commande (tous les fichiers .o). En outre, je pourrais envisager de regarder les deux fichiers .inl qui déclenchent le problème. Si vos paramètres de liaison sont corrects, il peut s'agir d'un problème d'espace de noms, auquel cas l'espace de noms utilisé pour rechercher la classe ne correspond pas à l'espace de noms correct. –

+0

Peut-être que vous devriez publier vos lignes de commande gcc, il y aura une grande ligne de commande ou plusieurs lignes de commande de compilation et/ou de liaison. –