编译DeSiNe时出错

Errors while compiling DeSiNe

本文关键字:出错 DeSiNe 编译      更新时间:2023-10-16

当我为项目DeSiNe运行make build[点击进入github页面]时,我得到了错误‘Topology’ does not name a type

$ make build
mkdir -m 755 -p obj/Algorithm
g++ -Wall -DNO_TIMER -DNO_TRACES  -O3 -funroll-loops -finline-functions -fexpensive-optimizations -Isrc -o obj/Algorithm/Algorithm.o -c src/Algorithm/Algorithm.cpp
In file included from src/Network/TopologyFactory.h:21:0,
                 from src/Network/Topology.h:25,
                 from src/Network/Flow.h:20,
                 from src/Algorithm/Algorithm.h:20,
                 from src/Algorithm/Algorithm.cpp:14:
src/RandomVariables/RandomNumberGenerator.h: In member function ‘double RandomNumberGenerator::generate()’:
src/RandomVariables/RandomNumberGenerator.h:158:43: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
         return (double) 2.0 - (*(float*) &itemp);
                                           ^
In file included from src/Network/Topology.h:25:0,
                 from src/Network/Flow.h:20,
                 from src/Algorithm/Algorithm.h:20,
                 from src/Algorithm/Algorithm.cpp:14:
src/Network/TopologyFactory.h: At global scope:
src/Network/TopologyFactory.h:76:5: error: ‘Topology’ does not name a type
     Topology* create(const TString &description);
     ^
src/Network/TopologyFactory.h:84:48: error: ‘Topology’ has not been declared
     void build(const NodePairDeque &nodepairs, Topology* topology);
                                                ^
src/Network/TopologyFactory.h:92:5: error: ‘Topology’ does not name a type
     Topology* createTopologyAdjacency(const TString &description);
     ^
src/Network/TopologyFactory.h:103:5: error: ‘Topology’ does not name a type
     Topology* createTopologyBarabasi(const TString &description);
     ^
src/Network/TopologyFactory.h:112:5: error: ‘Topology’ does not name a type
     Topology* createTopologyErdos(const TString &description);
     ^
src/Network/TopologyFactory.h:120:5: error: ‘Topology’ does not name a type
     Topology* createTopologyFile(const TString &description);
     ^
src/Network/TopologyFactory.h:129:5: error: ‘Topology’ does not name a type
     Topology* createTopologyFull(const TString &description);
     ^
src/Network/TopologyFactory.h:138:5: error: ‘Topology’ does not name a type
     Topology* createTopologyGrid2D(const TString &description);
     ^
src/Network/TopologyFactory.h:147:5: error: ‘Topology’ does not name a type
     Topology* createTopologyRandom(const TString &description);
     ^
make: *** [Algorithm/Algorithm] Error 1

但是所包含的CCD_ 3确实包含

class Topology : public AbstractNetworkElement
{
    // Friend(s)

如何解决?

编辑:添加Topology类的前向声明会产生进一步的错误:

In file included from src/Algorithm/SamcraBAlgorithm.h:22:0,
                 from src/Algorithm/SamcraBAlgorithm.cpp:17:
src/Utils/TString.h:25:7: error: using typedef-name ‘Types::TString’ after ‘class’
 class TString
       ^
In file included from src/LinkStateUpdate/LinkStateUpdateVisitor.h:23:0,
                 from src/Network/Link.h:19,
                 from src/Network/Topology.h:23,
                 from src/Network/Flow.h:20,
                 from src/Algorithm/Algorithm.h:22,
                 from src/Algorithm/SamcraBAlgorithm.cpp:16:
src/Utils/Types.h:65:24: note: ‘Types::TString’ has a previous declaration here
  typedef deque<string> TString;
                        ^
make: *** [Algorithm/SamcraBAlgorithm] Error 1

基本上,该项目有四个主要的编译问题:

  • TopologyFactory和Topology类之间的循环包含依赖关系
  • 当打算用作typedef时,直接包含TString.h头
  • 缺少cstdlib/csdio-includes
  • 类定义中的成员初始化(在C++11之前不可用)

第一个修复方案涉及从Topology标头中删除TopologyFactory,从而打破循环include依赖关系。然后在需要的地方包括TopologyFactory标头。

第二个问题很容易修复:只需删除TString头includes,它就可以默认使用Utils/Types.h中的定义。

第三个修复是琐碎的:只需在需要的地方添加cstdio/cstdlib includes。

最后一个修复方案涉及将静态初始化移到定义文件中(可能作者使用的是一个扩展名为的旧编译器,允许这种类型的初始化)。

我在这个要点上做了一个补丁,这样你就可以看到变化了。该项目在Ubuntu 15.10上使用g++5.2.1进行编译。

代码中有一个交叉引用。

Topology.h包括TopologyFactory.h,反之亦然TopologyFactory。h包括Topology。h

修复它的最简单方法是将Topology类的前向声明添加到TopologyFactory中。h:

#ifndef TOPOLOGYFACTORY_H
#define TOPOLOGYFACTORY_H
...
class Topology;
class TopologyFactory
{

更正确的方法是尝试解决这些依赖关系,即不要在Topology.h中包含TopologyNetwork.h,然后在所有使用TopologyNework和Topology的cpp文件中添加两个include指令:

/*                                                                                                                                                                                             
        source file DesineModel.cpp for class: DesineModel                                                                                                                               
     ... 
*/
...  
#include "Network/Topology.h"
#include "Network/TopologyFactory.h"
...