我有两个Omnet ++项目A和B。A当前需要B。是否可以以某种方式将B声明为A的功能,所以我可以打开和关闭它吗?我想拥有单独的项目,因为B可以在其他项目中重复使用。我在A中使用新的.oppfeatures文件添加了功能,并在C ++代码中添加了相应的ifdef语句。目前,我正在处理ned文件:
name='transmission'
如何有条件地导入B的文件?如果我使用通配符导入,则Omnet会在子模块声明中抱怨“没有这样的模块类型”。我的想法是使外部项目成为可能吗?还有其他想法可以实现这一目标(可能是git子模块之类的东西)吗?
谢谢!
答案 0 :(得分:2)
尝试遵循INET在TCP实现方面使用的模式。 INET拥有自己的TCP模块(在TCP_INET功能中),还有由TCP_lwIP和TCP_NSC功能定义的两个替代实现。查看src / makefrags文件,以检查向导如何基于特定功能的启用来添加编译器和链接器标志。例如:
WITH_TCP_LWIP := $(shell (cd .. && ./bin/inet_featuretool -q isenabled TCP_lwIP && echo enabled) )
ifeq ($(WITH_TCP_LWIP), enabled)
INCLUDE_PATH += -Iinet/transportlayer/tcp_lwip/lwip/include -Iinet/transportlayer/tcp_lwip/lwip/include/ipv4 -Iinet/transportlayer/tcp_lw
endif
此代码检查是否启用了TCP_lwIP功能,并添加了必要的包含路径。如果必须与外部项目链接,也可以添加链接器标志。 (如果不需要任何复杂的功能,也可以在oppfeatures文件中添加编译器和链接器标志)
现在,如何处理可选的NED类型?还要看看如何在StandardHost中定义TCP模块:
tcp: <default(firstAvailable("Tcp", "TcpLwip", "TcpNsc"))> like ITcp
由于给定的模块是可选的,因此您始终必须拥有可以代替它使用的“东西”。至少一个虚拟模块。现在有一个ITcp
接口模块(始终存在),所有不同的TCP实现都“实现”它。您在这里看到的是tcp
是一个类似于ITcp
模块的模块,在构建过程中,实际实现将是Tcp
,TcpLwip
或{{ 1}}(按此特定顺序)。 ned类型树中实际存在的那个。通过禁用功能,我们实际上也从ned路径中删除了给定的ned类型(该功能不包括给定的包含实现的NED包)。
来自OMNeT ++ API(NED函数):
字符串firstAvailable(...)
接受任意数量的字符串,将它们解释为NED类型名称(限定或不限定),并返回存在的第一个,并且其C ++实现类也可用。如果没有可用的类型,则会引发错误。
此NED功能是专门发明的,并已添加到OMNeT ++中,用于这些目的(扫描给定NED类型的存在情况)