OMNET++ 6.0.2编译报错:无法找到INET 4.5.2依赖库求解决及参考项目
问题:OMNeT++项目编译时无法找到INET依赖库
使用OMNeT++ 6.0.2、INET 4.5.2开发基于Time Flood协议的时间同步项目,拓扑为三角形结构,编译时始终提示无法找到INET依赖库,项目相关文件如下:
.ini配置文件
network = src.TriangleNetwork # Simulation settings **.wlan[*].mac.useAck = true **.wlan[*].mac.retryLimit = 7 **.wlan[*].radio.transmitter.power = 2mW **.wlan[*].radio.receiver.sensitivity = -85dBm # PHY layer settings **.wlan[*].radio.typename = "Ieee80211Radio" **.wlan[*].mac.typename = "Ieee80211Mac" **.wlan[*].mgmt.typename = "Ieee80211MgmtAdhoc" # Mobility *.node*.mobility.typename = "StaticMobility" # Position settings *.node[0].mobility.initialX = 100m *.node[0].mobility.initialY = 300m *.node[1].mobility.initialX = 400m *.node[1].mobility.initialY = 300m *.node[2].mobility.initialX = 250m *.node[2].mobility.initialY = 500m # Simulation time limit sim-time-limit = 100s
.ned拓扑文件
package src; import inet.node.inet.StandardHost; import inet.physicallayer.wireless.ieee80211.packetlevel.Ieee80211ScalarRadioMedium; import inet.mobility.static.StationaryMobility; channel Link extends ned.DatarateChannel { datarate = 100Mbps; delay = 1ms; // Fixed delay } network TriangleNetwork { parameters: int initiator = default(0); // Set the initiator node index @display("bgb=500,500"); submodules: radioMedium: Ieee80211ScalarRadioMedium { @display("p=250,250"); } node[0]: StandardHost { parameters: numWlanInterfaces = 1; @display("p=100,300;i=device/laptop"); wlan[0].typename = "Ieee80211Nic"; mobility.typename = "StaticMobility"; } node[1]: StandardHost { parameters: numWlanInterfaces = 1; @display("p=400,300;i=device/laptop"); wlan[0].typename = "Ieee80211Nic"; mobility.typename = "StaticMobility"; } node[2]: StandardHost { parameters: numWlanInterfaces = 1; @display("p=250,500;i=device/laptop"); wlan[0].typename = "Ieee80211Nic"; mobility.typename = "StaticMobility"; } connections: node[0].wlan[0].radioIn <-- radioMedium.medium; node[0].wlan[0].radioOut --> radioMedium.medium; node[1].wlan[0].radioIn <-- radioMedium.medium; node[1].wlan[0].radioOut --> radioMedium.medium; node[2].wlan[0].radioIn <-- radioMedium.medium; node[2].wlan[0].radioOut --> radioMedium.medium; node[0].wlan[0].mac <--> Link <--> node[1].wlan[0].mac; node[1].wlan[0].mac <--> Link <--> node[2].wlan[0].mac; node[2].wlan[0].mac <--> Link <--> node[0].wlan[0].mac; }
Makefile文件
# # OMNeT++/OMNEST Makefile for Syn # # This file was generated with the command: # opp_makemake -f --deep -KINET_PROJ=../../inet -DINET_IMPORT -I../inet/src -I$$\(INET_PROJ\)/src -I$$\(INET_PROJ\)/src -L$$\(INET_PROJ\)/src -L$$\(INET_PROJ\)/src -linet -lINET$$\(D\) -- ../inet/src # # Name of target to be created (-o option) TARGET_DIR = . TARGET_NAME = Syn$(D) TARGET = $(TARGET_NAME)$(EXE_SUFFIX) TARGET_IMPLIB = $(TARGET_NAME)$(IMPLIB_SUFFIX) TARGET_IMPDEF = $(TARGET_NAME)$(IMPDEF_SUFFIX) TARGET_FILES = $(TARGET_DIR)/$(TARGET) # User interface (uncomment one) (-u option) USERIF_LIBS = $(ALL_ENV_LIBS) # that is, $(QTENV_LIBS) $(CMDENV_LIBS) #USERIF_LIBS = $(CMDENV_LIBS) #USERIF_LIBS = $(QTENV_LIBS) # C++ include paths (with -I) INCLUDE_PATH = -I../inet/src -I$(INET_PROJ)/src -I$(INET_PROJ)/src # Additional object and library files to link with EXTRA_OBJS = ../inet/src # Additional libraries (-L, -l options) LIBS = $(LDFLAG_LIBPATH)$(INET_PROJ)/src $(LDFLAG_LIBPATH)$(INET_PROJ)/src -linet -lINET$(D) # Output directory PROJECT_OUTPUT_DIR = ../out PROJECTRELATIVE_PATH = src O = $(PROJECT_OUTPUT_DIR)/$(CONFIGNAME)/$(PROJECTRELATIVE_PATH) # Object files for local .cc, .msg and .sm files OBJS = $O/Adjust/ClockSyncApp.o $O/FTSP/FtspModule.o # Message files MSGFILES = # SM files SMFILES = # Other makefile variables (-K) INET_PROJ=../../inet #------------------------------------------------------------------------------ # Pull in OMNeT++ configuration (Makefile.inc) ifneq ("$(OMNETPP_CONFIGFILE)","") CONFIGFILE = $(OMNETPP_CONFIGFILE) else CONFIGFILE = $(shell opp_configfilepath) endif ifeq ("$(wildcard $(CONFIGFILE))","" ) $(error Config file '$(CONFIGFILE)' does not exist -- add the OMNeT++ bin directory to the path so that opp_configfilepath can be found, or set the OMNETPP_CONFIGFILE variable to point to Makefile.inc) endif include $(CONFIGFILE) # Simulation kernel and user interface libraries OMNETPP_LIBS = $(OPPMAIN_LIB) $(USERIF_LIBS) $(KERNEL_LIBS) $(SYS_LIBS) ifneq ($(PLATFORM),win32) LIBS += -Wl,-rpath,$(abspath $(INET_PROJ)/src) -Wl,-rpath,$(abspath $(INET_PROJ)/src) endif COPTS = $(CFLAGS) $(IMPORT_DEFINES) -DINET_IMPORT $(INCLUDE_PATH) -I$(OMNETPP_INCL_DIR) MSGCOPTS = $(INCLUDE_PATH) SMCOPTS = # we want to recompile everything if COPTS changes, # so we store COPTS into $COPTS_FILE (if COPTS has changed since last build) # and make the object files depend on it COPTS_FILE = $O/.last-copts ifneq ("$(COPTS)","$(shell cat $(COPTS_FILE) 2>/dev/null || echo '')") $(shell $(MKPATH) "$O") $(file >$(COPTS_FILE),$(COPTS)) endif #------------------------------------------------------------------------------ # User-supplied makefile fragment(s) -include makefrag #------------------------------------------------------------------------------ # Main target all: $(TARGET_FILES) $(TARGET_DIR)/% :: $O/% @mkdir -p $(TARGET_DIR) $(Q)$(LN) $< $@ ifeq ($(TOOLCHAIN_NAME),clang-msabi) -$(Q)-$(LN) $(<:%.dll=%.lib) $(@:%.dll=%.lib) 2>/dev/null $O/$(TARGET_NAME).pdb: $O/$(TARGET) endif $O/$(TARGET): $(OBJS) $(wildcard $(EXTRA_OBJS)) Makefile $(CONFIGFILE) @$(MKPATH) $O @echo Creating executable: $@ $(Q)$(CXX) $(LDFLAGS) -o $O/$(TARGET) $(OBJS) $(EXTRA_OBJS) $(AS_NEEDED_OFF) $(WHOLE_ARCHIVE_ON) $(LIBS) $(WHOLE_ARCHIVE_OFF) $(OMNETPP_LIBS) .PHONY: all clean cleanall depend msgheaders smheaders # disabling all implicit rules .SUFFIXES : .PRECIOUS : %_m.h %_m.cc $O/%.o: %.cc $(COPTS_FILE) | msgheaders smheaders @$(MKPATH) $(dir $@) $(qecho) "$<" $(Q)$(CXX) -c $(CXXFLAGS) $(COPTS) -o $@ $< %_m.cc %_m.h: %.msg $(qecho) MSGC: $< $(Q)$(MSGC) -s _m.cc -MD -MP -MF $O/$(basename $<)_m.h.d $(MSGCOPTS) $? %_sm.cc %_sm.h: %.sm $(qecho) SMC: $< $(Q)$(SMC) -c++ -suffix cc $(SMCOPTS) $? msgheaders: $(MSGFILES:.msg=_m.h) smheaders: $(SMFILES:.sm=_sm.h) clean: $(qecho) Cleaning $(TARGET) $(Q)-rm -rf $O $(Q)-rm -f $(TARGET_FILES) $(Q)-rm -f $(call opp_rwildcard, . , *_m.cc *_m.h *_sm.cc *_sm.h) cleanall: $(Q)$(CLEANALL_COMMAND) $(Q)-rm -rf $(PROJECT_OUTPUT_DIR) help: @echo "$$HELP_SYNOPSYS" @echo "$$HELP_TARGETS" @echo "$$HELP_VARIABLES" @echo "$$HELP_EXAMPLES" # include all dependencies -include $(OBJS:%=%.d) $(MSGFILES:%.msg=$O/%_m.h.d)
解决步骤
- 确保INET库已正确编译:进入INET 4.5.2目录,执行
make clean && make all,确认编译完成后生成的库文件(如libinet.so/inet.lib)存在于inet/src目录下。 - 修正Makefile路径与配置:
- 检查
INET_PROJ=../../inet是否匹配实际目录结构,若项目与INET的层级关系不符,调整为正确的相对/绝对路径(例如项目在projects/Syn、INET在projects/inet时,改为INET_PROJ=../inet)。 - 移除重复路径配置,简化为:
INCLUDE_PATH = -I$(INET_PROJ)/src LIBS = $(LDFLAG_LIBPATH)$(INET_PROJ)/src -linet -lINET$(D) - 删除错误的
EXTRA_OBJS = ../inet/src配置,无需将INET源码目录作为对象文件链接。
- 检查
- 重新生成Makefile:删除现有Makefile,在项目根目录执行正确的生成命令:
opp_makemake -f --deep -KINET_PROJ=../inet -DINET_IMPORT -I$(INET_PROJ)/src -L$(INET_PROJ)/src -linet - 验证环境与重新编译:确认OMNeT++的
bin目录已加入系统PATH,执行echo $INET_PROJ验证路径正确,最后执行make clean && make all重新编译。
基于OMNeT++的Flood类时间同步开源项目参考
- FTSP(Flooding Time Synchronization Protocol)实现:部分开源项目基于OMNeT++实现FTSP,核心通过广播同步包完成全网时间同步,可学习其包封装、时钟调整逻辑。
- RBS(Reference Broadcast Synchronization)模拟:RBS依赖广播参考包实现节点间同步,部分OMNeT++示例项目包含该协议的基础实现,可参考其Flood式消息分发机制。
- INET框架自带同步模块:INET中包含
ClockSynchronizer等基础模块,可基于这些模块扩展实现自定义的Flood时间同步逻辑。
内容的提问来源于stack exchange,提问作者duo chen
相关产品推荐
相关产品推荐

