构建 veins_inet 子项目时出错

Error when building veins_inet subproject

我在 Omnet++ 中导入 veins 4.5 项目(通过选择 "Search for nested projects")时导入了 veins_inet 子项目。 我已经建立了静脉并且可以 运行 Erlangen 示例。

但是,我无法构建 veins_inet 项目。 来源可以在这里找到:https://github.com/sommer/veins/tree/master/subprojects/veins_inet
我收到以下错误:

make MODE=debug all 
make[1]: Entering directory '/home/XX/omnetpp-5.1.1/samples/veins/subprojects/veins_inet/src'
veins_inet/VeinsInetManager.cc
veins_inet/VeinsInetManager.cc:21:41: fatal error: veins_inet/VeinsInetManager.h: No such file or directory
compilation terminated.
Makefile:97: recipe for target '../out/gcc-debug/src/veins_inet/VeinsInetManager.o' failed
make[1]: Leaving directory '/home/XX/omnetpp-5.1.1/samples/veins/subprojects/veins_inet/src'
Makefile:12: recipe for target 'all' failed
make[1]: *** [../out/gcc-debug/src/veins_inet/VeinsInetManager.o] Error 1
make: *** [all] Error 2

好像是头文件加载失败

我可以通过手动将所有必要的 *.h 文件复制到 veins_inet/src/veins_inet 文件夹并编辑 *.cc 和 *.h 文件来绕过 "No such file or directory" 错误,这样编译器就可以找到所需的头文件。
我想问题出在 Makefile 中,或者更确切地说是出在生成 Makefile 的配置文件中。

veins_inet/configure:

#!/usr/bin/env python

"""
Creates Makefile(s) for building Veins_INET.
"""

import os
import sys
import subprocess
from logging import warning, error
from optparse import OptionParser


# Option handling
parser = OptionParser()
parser.add_option("--with-veins", dest="veins", help="link Veins_INET with a version of Veins installed in PATH [default: do not link with Veins]", metavar="PATH", default="../..")
parser.add_option("--with-inet", dest="inet", help="link Veins_INET with a version of the INET Framework installed in PATH [default: do not link with INET]", metavar="PATH", default="../../../inet")
(options, args) = parser.parse_args()

if args:
    warning("Superfluous command line arguments: \"%s\"" % " ".join(args))


# Start with default flags
makemake_flags = ['-f', '--deep', '--no-deep-includes', '--make-so', '-I', '.', '-o', 'veins_inet', '-O', 'out']
run_libs = [os.path.join('src', 'veins_inet')]
run_neds = [os.path.join('src', 'veins_inet')]


# Add flags for Veins
if options.veins:
    check_fname = os.path.join(options.veins, 'src/veins/package.ned')
    expect_version = '4'
    if not os.path.isfile(check_fname):
        error('Could not find Veins (by looking for %s). Check the path to Veins (--with-veins=... option) and the Veins version (should be version %s)' % (check_fname, expect_version))
        sys.exit(1)

    veins_header_dirs = [os.path.join(os.path.relpath(options.veins, 'src'), 'src')]
    veins_includes = ['-I' + s for s in veins_header_dirs]
    veins_link = ["-L" + os.path.join(os.path.relpath(options.veins, 'src'), 'src'), "-lveins"]
    veins_defs = []

    makemake_flags += veins_includes + veins_link + veins_defs
    run_libs = [os.path.relpath(os.path.join(options.veins, 'src', 'veins'))] + run_libs
    run_neds = [os.path.relpath(os.path.join(options.veins, 'src', 'veins'))] + run_neds


# Add flags for INET
if options.inet:
    fname = os.path.join(options.inet, '_scripts/get_version')
    expect_version = '3.4.0'
    try:
        print 'Running "%s" to determine INET version.' % fname
        version = subprocess.check_output(fname).strip()
        if not version == expect_version:
            warning('Unsupported INET Version. Expecting %s, found "%s"' % (expect_version, version))
        else:
            print 'Found INET version "%s". Okay.' % version
    except OSError as e:
        error('Could not determine INET Version (by running %s): %s. Check the path to INET (--with-inet=... option) and the INET version (should be version %s)' % (fname, e, expect_version))
        sys.exit(1)

    inet_header_dirs = [os.path.join(os.path.relpath(options.inet, 'src'), 'src')]
    inet_includes = ['-I' + s for s in inet_header_dirs]
    inet_link = ["-L" + os.path.join(os.path.relpath(options.inet, 'src'), 'src'), "-lINET"]
    inet_defs = ["-DINET_IMPORT"]

    makemake_flags += inet_includes + inet_link + inet_defs
    run_libs = [os.path.relpath(os.path.join(options.inet, 'src', 'INET'))] + run_libs
    run_neds = [os.path.relpath(os.path.join(options.inet, 'src'))] + run_neds


# Start creating files
if not os.path.isdir('out'):
    os.mkdir('out')

f = open(os.path.join('out', 'config.py'), 'w')
f.write('run_libs = %s\n' % repr(run_libs))
f.write('run_neds = %s\n' % repr(run_neds))
f.close()

subprocess.check_call(['env', 'opp_makemake'] + makemake_flags, cwd='src')

print 'Configure done. You can now run "make".'

veins_inet/Makefile

.PHONY: all makefiles clean cleanall doxy

# if out/config.py exists, we can also create command line scripts for running simulations
ADDL_TARGETS =
ifeq ($(wildcard out/config.py),)
else
    ADDL_TARGETS += run debug memcheck
endif

# default target
all: src/Makefile $(ADDL_TARGETS)
    @cd src && $(MAKE)

# command line scripts
run debug memcheck: % : src/scripts/%.in.py out/config.py
    @echo "Creating script \"./$@\""
    @head -n1 "$<" > "$@"
    @cat out/config.py >> "$@"
    @tail -n+2 "$<" >> "$@"
    @chmod a+x "$@"

# legacy
makefiles:
    @echo
    @echo '====================================================================='
    @echo 'Warning: make makefiles has been deprecated in favor of ./configure'
    @echo '====================================================================='
    @echo
    ./configure
    @echo
    @echo '====================================================================='
    @echo 'Warning: make makefiles has been deprecated in favor of ./configure'
    @echo '====================================================================='
    @echo

clean: src/Makefile
    cd src && $(MAKE) clean
    rm -f run debug memcheck

cleanall: src/Makefile
    cd src && $(MAKE) MODE=release clean
    cd src && $(MAKE) MODE=debug clean
    rm -f src/Makefile
    rm -f run debug memcheck

src/Makefile:
    @echo
    @echo '====================================================================='
    @echo '$@ does not exist.'
    @echo 'Please run "./configure" or use the OMNeT++ IDE to generate it.'
    @echo '====================================================================='
    @echo
    @exit 1

out/config.py:
    @echo
    @echo '====================================================================='
    @echo '$@ does not exist.'
    @echo 'Please run "./configure" to generate it.'
    @echo '====================================================================='
    @echo
    @exit 1

# autogenerated documentation
doxy:
    doxygen doxy.cfg

doxyshow: doxy
    xdg-open doc/doxy/index.html

veins_inet/src/Makefile

#
# OMNeT++/OMNEST Makefile for $(LIB_PREFIX)veins_inet
#
# This file was generated with the command:
#  opp_makemake --make-so -f --deep -KINET_PROJ=../../../../inet -KVEINS_PROJ=../../.. -L$$\(INET_PROJ\)/out/$$\(CONFIGNAME\)/src -L$$\(VEINS_PROJ\)/out/$$\(CONFIGNAME\)/src -lINET -lveins
#

# Name of target to be created (-o option)
TARGET = $(LIB_PREFIX)veins_inet$(SHARED_LIB_SUFFIX)

# C++ include paths (with -I)
INCLUDE_PATH =

# Additional object and library files to link with
EXTRA_OBJS =

# Additional libraries (-L, -l options)
LIBS = $(LDFLAG_LIBPATH)$(INET_PROJ)/out/$(CONFIGNAME)/src $(LDFLAG_LIBPATH)$(VEINS_PROJ)/out/$(CONFIGNAME)/src  -lINET -lveins

# 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/veins_inet/VeinsInetManager.o $O/veins_inet/VeinsInetMobility.o

# Message files
MSGFILES =

# SM files
SMFILES =

# Other makefile variables (-K)
INET_PROJ=../../../../inet
VEINS_PROJ=../../..

#------------------------------------------------------------------------------

# Pull in OMNeT++ configuration (Makefile.inc)

ifneq ("$(OMNETPP_CONFIGFILE)","")
CONFIGFILE = $(OMNETPP_CONFIGFILE)
else
ifneq ("$(OMNETPP_ROOT)","")
CONFIGFILE = $(OMNETPP_ROOT)/Makefile.inc
else
CONFIGFILE = $(shell opp_configfilepath)
endif
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 = -loppenvir$D $(KERNEL_LIBS) $(SYS_LIBS)
ifneq ($(TOOLCHAIN_NAME),clangc2)
LIBS += -Wl,-rpath,$(abspath $(INET_PROJ)/out/$(CONFIGNAME)/src) -Wl,-rpath,$(abspath $(VEINS_PROJ)/out/$(CONFIGNAME)/src)
endif

COPTS = $(CFLAGS) $(IMPORT_DEFINES)  $(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 and have object
# files depend on it (except when "make depend" was called)
COPTS_FILE = $O/.last-copts
ifneq ("$(COPTS)","$(shell cat $(COPTS_FILE) 2>/dev/null || echo '')")
$(shell $(MKPATH) "$O" && echo "$(COPTS)" >$(COPTS_FILE))
endif

#------------------------------------------------------------------------------
# User-supplied makefile fragment(s)
# >>>
# <<<
#------------------------------------------------------------------------------

# Main target
all: $O/$(TARGET)
    $(Q)$(LN) $O/$(TARGET) .

$O/$(TARGET): $(OBJS)  $(wildcard $(EXTRA_OBJS)) Makefile $(CONFIGFILE)
    @$(MKPATH) $O
    @echo Creating shared library: $@
    $(Q)$(SHLIB_LD) -o $O/$(TARGET) $(OBJS) $(EXTRA_OBJS) $(AS_NEEDED_OFF) $(WHOLE_ARCHIVE_ON) $(LIBS) $(WHOLE_ARCHIVE_OFF) $(OMNETPP_LIBS) $(LDFLAGS)
    $(Q)$(SHLIB_POSTPROCESS) $O/$(TARGET)

.PHONY: all clean cleanall depend msgheaders smheaders

.SUFFIXES: .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 $(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...
    $(Q)-rm -rf $O
    $(Q)-rm -f $(TARGET)
    $(Q)-rm -f $(call opp_rwildcard, . , *_m.cc *_m.h *_sm.cc *_sm.h)

cleanall: clean
    $(Q)-rm -rf $(PROJECT_OUTPUT_DIR)

# include all dependencies
-include $(OBJS:%.o=%.d)

有人解决了这个问题吗?

为了解决这个问题,我必须将缺少的 "Include Paths" 添加到项目属性中:
1. Select 您的 veins_inet 项目并在 Omnet++
中单击 Project>>Properties 2. 在新的 window 中展开 OMNeT++ 条目和 select Makemake
3.selectsrc:makemake(deep,recurse)-->veins_inet(dynamic lib)
4.点击Options...按钮
它应该是这样的:Properties for veins_inet window
5. 转到打开
的 window 中的 Compile 选项卡 6. 输入缺少的包含目录:

[workspace]/veins/subprojects/veins_ine‌​‌​t/src
[workspace]/veins/src
[workspace]/inet/src

你应该得到类似的结果:Makemake Options window
7.在windows
中点击确定 8. 您应该能够正确构建 veins_inet 项目

如果您使用 omnet++ 5.0 版本: IDE Project->properties->OMNET++ -> Makemake -> select src -> build makemake selected options button -> compile -> 勾选 [add all source folders under this deep makefile ] :: 然后刷新并构建项目 ..