Проблема со сборкой собственного модуля в omnetpp

Я пытаюсь написать приложение, используя модуль UDP, включенный в структуру inetmanet в omnetpp. Проблема в том, что файлы, которые я должен включить, не включаются на этапе связывания.

Ошибки:

opp_makemake

bedo@ethereal:~/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

делать

bedo@ethereal:~/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
bedo@ethereal:~/omnetpp/samples/Basic-Broadcast-Simulation$

Я действительно не знаю, почему они включены, и мой модуль компилируется нормально, но на этапе компоновки я получаю «неопределенную ссылку».

Есть идеи?


person lbedogni    schedule 12.12.2010    source источник
comment
Если здесь нет эксперта по omnetpp, для этого потребуется некоторое время назад и вперед. Makefiles неправильно обрабатывают зависимости, поэтому компоновщик не связывает код UDP (или, по крайней мере, не ту его часть, которая нужна Flooding). Вы можете начать с поиска исходного файла, содержащего, например. UDPControlInfo(), и узнать, был ли он скомпилирован в объектный файл, и если да, был ли этот объектный файл связан с библиотекой.   -  person Beta    schedule 12.12.2010


Ответы (2)


Вы можете запустить nm для всех библиотек, с которыми вы связываетесь, чтобы увидеть, какие библиотеки не определены, например:

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

(c++filt разбирает символы C++).

Библиотека, которой требуется символ, выведет что-то вроде (U для Undefined):

00000000007f90a0 U UDPControlInfo

Библиотека, которая определяет/имеет символ, выведет что-то вроде:

00000000007f90a0 T UDPControlInfo

Это может быть T или t

Конечно, библиотеки, с которыми вы линкуетесь, обозначаются аргументами, начинающимися с -l:

-lopptkenvd -loppenvird -lopplayoutd -u _cmdenv_lib -loppcmdenvd -loppenvird  
liboppcmdenvd liboppenvird  liboppsimd libUDPControlInfo
person dimba    schedule 12.12.2010

Решено. Я изменил make-файл в корневом каталоге на более простой, оставив все обязанности по компиляции и компоновке make-файлу src.

Спасибо всем

person lbedogni    schedule 13.12.2010