Ошибка при построении подпроекта veins_inet

Я импортировал подпроект veins_inet при импорте проекта veins 4.5 (выбрав «Поиск вложенных проектов») в Omnet ++. Я построил вены и могу запустить пример Эрлангена.

Однако я не могу собрать проект 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, чтобы компилятор нашел необходимые файлы заголовков. .
Я предполагаю, что проблема кроется в файлах Makefile, или, скорее, в файле конфигурации, который генерирует файлы Makefile.

veins_inet / настроить:

#!/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)

Кто-нибудь решил проблему?


person zanlik    schedule 06.06.2017    source источник
comment
Похоже на стандартную проблему с заголовками, которые не установлены в стандартном каталоге include или в любом другом месте, которое configure добавляет как -I путь к Makefile. Нет смысла говорить нам, что вы предполагаете, что проблема в этих файлах, не публикуя, что они собой представляют.   -  person underscore_d    schedule 06.06.2017
comment
В ПОРЯДКЕ. Добавлено содержимое файлов конфигурации и Makefile.   -  person zanlik    schedule 06.06.2017
comment
Мне удалось успешно построить проект, изменив файл veins_inet / src / Makefile следующим образом: INCLUDE_PATH = -I / home / XX / omnetpp-5.1.1 / samples / veins / subprojects / veins_inet / src / -I / home / XX / omnetpp-5.1.1 / samples / veins / src -I /home/XX/omnetpp-5.1.1/samples/inet/src. Но как изменить файл конфигурации, чтобы отразить эти изменения?   -  person zanlik    schedule 06.06.2017
comment
Вероятно, этого не должно быть, потому что настройку сборки проекта следует оставить такой, какой она была задумана проектом, и если вам нужно сделать другие вещи с другими путями, вы должны переопределить это локально, а не взламывать собственные файлы проекта. Итак, вы должны использовать файл сайта или -I аргументы, добавленные к вашему configure вызову. См. stackoverflow.com/questions/7467910/, из которых, вероятно, (сейчас) является дубликатом.   -  person underscore_d    schedule 06.06.2017
comment
Спасибо за вашу помощь. Я добавил эти пути в следующем месте: Щелкните правой кнопкой мыши проект veins_inet. ›› Свойства ›› Omnet ++ (стрелка вниз) ›› Makemake ›› выберите src: makemake .... ›› нажмите Параметры ›› Перейти на вкладку Compile ›› включите 3 обязательных каталога ... в моем случае: /home/XX/omnetpp-5.1.1/samples/veins/subprojects/veins_ine‌ t / src /home/XX/omnetpp-5.1.1/samples/veins/src /home/XX/omnetpp-5.1.1/samples/inet/src Они будут добавлены во время компиляции. Проблема решена. Спасибо!   -  person zanlik    schedule 06.06.2017
comment
Круто, рад, что у вас все получилось, спасибо, что сообщили мне об этом!   -  person underscore_d    schedule 06.06.2017


Ответы (2)


Чтобы решить эту проблему, мне пришлось добавить отсутствующие «Включить пути» в свойства проекта:
1. Выберите свой проект veins_inet и щелкните Project>>Properties в Omnet ++
2. В новом окне разверните запись OMNeT++ и выберите Makemake
3. выберите src:makemake(deep,recurse)-->veins_inet(dynamic lib)
4. Нажмите кнопку Options...
Он должен выглядеть так: Свойства окна veins_inet
5. В открывшемся окне перейдите на вкладку Compile
6. Введите недостающие каталоги include:

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

У вас должно получиться что-то похожее: Окно параметров Makemake
7. Нажмите OK в обоих окнах
8. Вы сможете собрать проект veins_inet без ошибок.

person zanlik    schedule 06.06.2017

если вы используете версию omnet ++ 5.0: IDE Project-> properties-> OMNET ++ -> Makemake -> выберите src -> build makemake selected options button -> compile -> check [добавить все исходные папки в этот глубокий make-файл] :: затем обновите и построить проект ..

person Vadim Hapanchak    schedule 20.12.2017