Как использовать библиотеку лимонного графа в проектах Omnet ++?

Я пытаюсь создать сеть (случайный график) в omnet ++, где я хочу анализировать сетевые узлы с помощью библиотеки Lemon Graph. Я установил библиотеку, и она отлично работает, если я попытаюсь скомпилировать любой обычный файл 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){

}`

заголовки include заключены в угловые скобки (не путать с двойными кавычками). Поэтому, когда я создаю код, я получаю следующие ошибки:

    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 ++ не совместим с библиотекой графов Lemon?


person Vijay Rana    schedule 20.07.2015    source источник
comment
stackoverflow.com/ questions / 19912682 /   -  person Kristof Pal    schedule 21.07.2015


Ответы (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")
person Christoph Sommer    schedule 21.07.2015