Как использовать библиотеку лимонов на проектах Omnet++?
Я пытаюсь спроектировать сеть (Random Graph) в omnet ++, где я хочу проанализировать сетевые узлы, используя Lemon Graph Library. Я установил библиотеку, и она работает нормально, если я пытаюсь скомпилировать любой нормальный файл C++ с узлами и ребрами в любом графике с помощью командной строки g++ -o file file.cpp/cc -lemon
, Но когда я попробовал это с одним из моих проектов omnet ++ (в котором сейчас ничего нет), код был таким, как показано ниже
#include <omnetpp.h>
#include <iostream>
#include <lemon/list_graph.h>
using namespace lemon;
using namespace std;
class Facility : public cSimpleModule
{
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg);
};
Define_Module(Facility);
void Facility :: initialize(){
}
void Facility :: handleMessage(cMessage *msg){
}`
заголовки включения указаны в угловых скобках (не путать с двойными кавычками). Поэтому, когда я строю код, я получаю следующие ошибки:
Description Resource Path Location Type
‘class cEnvir’ has no member named ‘push_back’ PSUC line 686, external location: /usr/local/include/lemon/bits/graph_extender.h C/C++ Problem
‘class cEnvir’ has no member named ‘push_back’ PSUC line 687, external location: /usr/local/include/lemon/bits/graph_extender.h C/C++ Problem
‘test’ does not name a type test.cc /ztest line 9 C/C++ Problem
invalid use of qualified-name ‘cSimulation::getActiveEnvir’ PSUC line 69, external location: /home/vijay/omnetpp-4.6/include/cenvir.h C/C++ Problem
make: *** [out/gcc-debug//psuc.o] Error 1 PSUC C/C++ Problem
make: *** [out/gcc-debug//test.o] Error 1 ztest C/C++ Problem
no matching function for call to ‘lemon::AlterationNotifier<lemon::GraphExtender<lemon::ListGraphBase>, lemon::ListGraphBase::Arc>::add(cEnvir&)’ PSUC line 688, external location: /usr/local/include/lemon/bits/graph_extender.h C/C++ Problem
Почему код Omnet++ не совместим с библиотекой графов Лимона?
1 ответ
OMNeT++ включает определение макроса для ev
в cEnvir.h
(который включен из omnetpp.h
)
#define ev (*cSimulation::getActiveEnvir())
Потому что вы включаете omnetpp.h
до graph_extender.h
этот макрос раскрывается в заголовочном файле библиотеки, что противоречит его использованию в качестве имени переменной в
ev.push_back(Parent::direct(edge, true));
Простое решение будет включать graph_extender.h
до omnetpp.h
поэтому макрос еще не определен, когда graph_extender.h
читается Если это невозможно, вам может повезти с ручным отменой определения макроса до (и, возможно, восстановлением определения после), как показано ниже.
#pragma push_macro("ev")
#undef ev
#include "graph_extender.h"
#pragma pop_macro("ev")