继承omnet++ INET类的简单模块出现重复符号构建错误的原因是什么?

问题描述

我将 omnet++ 6.0 和 INET 4.3 与 gcc 编译器一起使用。我尝试制作一个继承 INET 类的简单模块,如下所示,导致在构建时出现重复的符号错误。我不知道为什么。代码尽可能简单,只是为了揭示构建错误。该方法是否缺少任何重要的东西?

在.cc 文件添加Define_Module() 时,出现重复符号构建错误。构建错误信息部分如下:

../../inet4.3/src/inet/common/packet/tag/SharingRegionTagSet.h:318:55: warning: 'const inet::SharingRegionTagSet::RegionTag<inet::TagBase>& inet::SharingRegionTagSet::getRegionTag(int) const' redeclared without dllimport attribute after being referenced with dll linkage
  318 | inline const SharingRegionTagSet::RegionTag<TagBase>& SharingRegionTagSet::getRegionTag(int index) const
      |                                                       ^~~~~~~~~~~~~~~~~~~
../../inet4.3/src/inet/common/packet/tag/SharingRegionTagSet.h:323:54: warning: 'const inet::SharingRegionTagSet::RegionTag<inet::TagBase> inet::SharingRegionTagSet::getRegionTagForUpdate(int)' redeclared without dllimport attribute after being referenced with dll linkage
  323 | inline const SharingRegionTagSet::RegionTag<TagBase> SharingRegionTagSet::getRegionTagForUpdate(int index)
      |                                                      ^~~~~~~~~~~~~~~~~~~
Creating executable: ../out/gcc-release/src/hdc.exe
lld-link: error: duplicate symbol: virtual thunk to inet::queueing::PacketFilterBase::getConsumer(omnetpp::cGate*)
>>> defined at ../out/gcc-release/src/my8021qTagEpdHeaderChecker.o
>>> defined at libINET.dll

对应的ned文件“my8021qTagEpdHeaderChecker.ned”是..

import inet.linklayer.ieee8021q.Ieee8021qTagEpdHeaderChecker;

simple my8021qTagEpdHeaderChecker extends Ieee8021qTagEpdHeaderChecker //like IIeee8021qTagEpdHeaderChecker
{
    parameters:
        
        @class(inet::my8021qTagEpdHeaderChecker);
        @display("i=block/checker");   
    
}

文件“my8021qTagEpdHeaderChecker.h”是

#include "inet/linklayer/ieee8021q/Ieee8021qTagEpdHeaderChecker.h"

namespace inet {

class my8021qTagEpdHeaderChecker : public Ieee8021qTagEpdHeaderChecker
{

protected:
 //   virtual void processpacket(Packet *packet) override;
};

} // namespace inet

和.cc文件“my8021qTagEpdHeaderChecker.cc”被制作为

#include "my8021qTagEpdHeaderChecker.h"

namespace inet {

Define_Module(my8021qTagEpdHeaderChecker);


}

解决方法

这可能是文件或 INET 中头文件的顺序问题。尝试将 INETDefs.h 文件作为第一个包含在所有头文件中。