2010-12-12 61 views
0

J'essaye d'écrire une application en utilisant le module UDP inclus dans le cadre inetmanet de omnetpp. Le problème est que les fichiers que je dois inclure ne sont pas inclus dans la phase de liaison.Problème dans la construction de mon propre module dans omnetpp

Les erreurs sont les suivantes:

opp_makemake

[email protected]:~/omnetpp/samples/Basic-Broadcast-Simulation$ opp_makemake --deep -f -I../inet-sommer/src/transport/contract -I../inet-sommer/src/networklayer/contract -I../inet-sommer/src/base 
Creating Makefile in /home/bedo/omnetpp/samples/Basic-Broadcast-Simulation... 
Makefile created, running "make depend" to add dependencies... 
opp_makedep -Y --objdirtree -I../inet-sommer/src/transport/contract -I../inet-sommer/src/networklayer/contract -I../inet-sommer/src/base -I. -Igcc-debug -Igcc-debug/src -Igcc-debug/src/flooding -Isimulations -Isimulations/bitmaps -Isimulations/results -Isrc -Isrc/flooding -f Makefile -P\$O/ -- ./*.cc gcc-debug/*.cc gcc-debug/src/*.cc gcc-debug/src/flooding/*.cc simulations/*.cc simulations/bitmaps/*.cc simulations/results/*.cc src/*.cc src/flooding/*.cc 

font

[email protected]:~/omnetpp/samples/Basic-Broadcast-Simulation$ make 
g++ -c -g -Wall -fno-stack-protector -DHAVE_PCAP -DXMLPARSER=libxml -DWITH_PARSIM -DWITH_NETBUILDER -I../inet-sommer/src/transport/contract -I../inet-sommer/src/networklayer/contract -I../inet-sommer/src/base -I. -Igcc-debug -Igcc-debug/src -Igcc-debug/src/flooding -Isimulations -Isimulations/bitmaps -Isimulations/results -Isrc -Isrc/flooding -I/home/bedo/omnetpp/include -o out/gcc-debug//src/flooding/Flooding.o src/flooding/Flooding.cc 
src/flooding/Flooding.cc: In member function ‘virtual void Flooding::handleLowerMsg(cMessage*)’: 
src/flooding/Flooding.cc:82: warning: unused variable ‘m’ 
g++ -Wl,--export-dynamic -Wl,-rpath,/home/bedo/omnetpp/lib -Wl,-rpath,. -o out/gcc-debug//Basic-Broadcast-Simulation out/gcc-debug//src/flooding/Flooding.o -Wl,--whole-archive -Wl,--no-whole-archive -L"/home/bedo/omnetpp/lib/gcc" -L"/home/bedo/omnetpp/lib" -u _tkenv_lib -lopptkenvd -loppenvird -lopplayoutd -u _cmdenv_lib -loppcmdenvd -loppenvird -loppsimd -ldl -lstdc++ 
out/gcc-debug//src/flooding/Flooding.o: In function `Flooding::setupLowerLayer()': 
/home/bedo/omnetpp/samples/Basic-Broadcast-Simulation/src/flooding/Flooding.cc:50: undefined reference to `UDPControlInfo::UDPControlInfo()' 
/home/bedo/omnetpp/samples/Basic-Broadcast-Simulation/src/flooding/Flooding.cc:52: undefined reference to `UDPSocket::generateSocketId()' 
out/gcc-debug//src/flooding/Flooding.o: In function `Flooding::sendMessage()': 
/home/bedo/omnetpp/samples/Basic-Broadcast-Simulation/src/flooding/Flooding.cc:101: undefined reference to `UDPControlInfo::UDPControlInfo()' 
/home/bedo/omnetpp/samples/Basic-Broadcast-Simulation/src/flooding/Flooding.cc:103: undefined reference to `IPAddress::ALL_HOSTS_MCAST' 
collect2: ld returned 1 exit status 
make: *** [out/gcc-debug//Basic-Broadcast-Simulation] Error 1 
[email protected]:~/omnetpp/samples/Basic-Broadcast-Simulation$ 

Je ne sais vraiment pas pourquoi ils sont inclus, et mon module compile très bien, mais dans la phase de liaison Je reçois "référence indéfinie".

Une idée?

+2

Sauf s'il y a un expert omnetpp ici, cela nécessitera des allers-retours. Les makefiles ne gèrent pas les dépendances correctement, de sorte que l'éditeur de liens ne liera pas le code UDP (ou du moins pas la partie dont le 'Flooding 'a besoin). Vous pouvez commencer par trouver le fichier source contenant, par exemple, 'UDPControlInfo()', et de découvrir si elle a été compilée dans un fichier objet, et si oui, si ce fichier objet a été lié dans une bibliothèque. – Beta

Répondre

0

Résolue. J'ai modifié le fichier makefile dans le répertoire racine à un plus simple, en laissant toutes les tâches de compilation et de liaison au makefile du src.

Merci à tous

0

Vous pouvez exécuter nm sur sur toutes les bibliothèques que vous lien avec pour voir quelle bibliothèque des symboles non définis comme ceci:

nm liboppcmdenvd.(so/a) | c++filt | grep UDPControlInfo 

(c++filt demangles C++ symboles).

Bibliothèque qui nécessite le symbole obtenir quelque chose de sortie comme (U pour non définie):

00000000007f90a0 U UDPControlInfo 

Library qui définit/a le symbole obtenir quelque chose de sortie comme:

00000000007f90a0 T UDPControlInfo 

Cela peut être T ou t

Bien sûr, les bibliothèques auxquelles vous liez sont indiquées par des arguments commençant par -l:

-lopptkenvd -loppenvird -lopplayoutd -u _cmdenv_lib -loppcmdenvd -loppenvird 
liboppcmdenvd liboppenvird liboppsimd libUDPControlInfo