0

I have imported the veins_inet subproject when importing the veins 4.5 project (by selecting the "Search for nested projects") in Omnet++. I have built veins and can run the Erlangen example.

However, I cannot build the veins_inet project. The sources can be found here: https://github.com/sommer/veins/tree/master/subprojects/veins_inet
I get the following error:

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

It seems like the header files have failed to be included.

I can bypass the "No such file or directory" errors by manually copying all necessary *.h files into the veins_inet/src/veins_inet folder and editing the *.cc and *.h files, such that the compiler finds the required header files.
I guess the issue lies in the Makefiles, or rather in the configure file, which generates the Makefiles.

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)

Has anybody solved the issue ?

zanlik
  • 41
  • 1
  • 6
  • Looks like a bog-standard problem with the headers not being installed in the standard `include` directory, or in whatever location that the `configure` adds as a `-I` path to the `Makefile`. There is no point telling us that you guess the issue is in those files, without posting what they are. – underscore_d Jun 06 '17 at 09:03
  • OK. Added the content of configure and Makefile files. – zanlik Jun 06 '17 at 09:12
  • I managed to build the project successfully by modifying the veins_inet/src/Makefile as follows: 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. But how should the configure file be modified to reflect those changes ? – zanlik Jun 06 '17 at 09:43
  • Probably it should not, because the project's build setup should be left as the project intended it to be, and if you need to do other things with other paths, you should override that locally rather than hacking on the project's own files. So, you should use a site file or `-I` arguments added to your `configure` invocation. See https://stackoverflow.com/questions/7467910/with-autoconf-automake-how-do-i-specify-include-file-paths of which this is probably (now) a duplicate. – underscore_d Jun 06 '17 at 09:49
  • 1
    Thanks for your help. I added those paths in the following place: Right-click on veins_inet project >> Properties >> Omnet++ (down arrow) >> Makemake >> select src:makemake.... >> click Options >> Go to Compile tab >> include the 3 required directories...in my case: /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 These will be added during the compilation time. Problem solved. Thanks! – zanlik Jun 06 '17 at 10:16
  • Cool, glad you get it working, thanks for letting me know! – underscore_d Jun 06 '17 at 10:31
  • https://m.youtube.com/watch?v=s9BhTl-hd8o A video tutorial depicting how to configure veins for running sub projects like veins testsim, veins catch and others. – Pasha M. Feb 22 '22 at 09:48

2 Answers2

4

To solve the problem I had to add missing "Include Paths" to the project properties:
1. Select your veins_inet project and click Project>>Properties in Omnet++
2. In the new window expand the OMNeT++ entry and select Makemake
3. select src:makemake(deep,recurse)-->veins_inet(dynamic lib)
4. Click on the Options... button
It should look like this: Properties for veins_inet window
5. Go to the Compile tab in the window that opens
6. Enter the missing include directories:

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

You should end up with something similar: Makemake Options window
7. Click OK in both windows
8. You should be able to build the veins_inet project without errors

zanlik
  • 41
  • 1
  • 6
0

if you use omnet++ 5.0 version : IDE Project->properties->OMNET++ -> Makemake -> select src -> build makemake selected options button -> compile -> check [add all source folders under this deep makefile] :: then refresh and build project ..