4

I am trying to compile the following code:

#include <map>

int main() {
  std::map<double, double> test;

  return 0;
}

using the following command:

icpc -I /usr/include/x86_64-linux-gnu/c++/8  main.cpp -o test

I get the following error:

/usr/include/c++/8/bits/stl_tree.h(700): error: identifier 
"_Node_allocator" is undefined
            _GLIBCXX_NOEXCEPT_IF(

            ^
          detected during instantiation of "std::_Rb_tree<_Key, _Val, 
_KeyOfValue, _Compare, _Alloc>::_Rb_tree_impl<_Key_compare, 
<unnamed>>::_Rb_tree_impl() [with _Key=double, _Val=std::pair<const 
double, double>, _KeyOfValue=std::_Select1st<std::pair<const double,double>>, _Compare=std::less<double>, Alloc=std::allocator<std::pair<const double, double>>,_Key_compare=std::less<double>, <unnamed>=true]"
at line 6 of "main.cpp"

together with a handful of type traits errors like the following:

/usr/include/c++/8/type_traits(921): error: not a class or struct name
      : public __is_default_constructible_atom<_Tp>::type
               ^
          detected during:
            instantiation of class 
"std::__is_default_constructible_safe<_Tp, false> [with _Tp=<error-
type>]" at line 927
            instantiation of class "std::is_default_constructible<_Tp> 
[with _Tp=<error-type>]" at line 144
            instantiation of class "std::__and_<_B1, _B2> [with 
_B1=std::is_default_constructible<<error-type>>, 
_B2=std::__is_nt_default_constructible_impl<<error-type>, false>]" at 
line 995
            instantiation of class 
"std::is_nothrow_default_constructible<_Tp> [with _Tp=<error-type>]" 
at line 700 of "/usr/include/c++/8/bits/stl_tree.h"
            instantiation of "std::_Rb_tree<_Key, _Val, _KeyOfValue, 
_Compare, _Alloc>::_Rb_tree_impl<_Key_compare, 
<unnamed>>::_Rb_tree_impl() [with _Key=double, _Val=std::pair<const 
double, double>, _Key
OfValue=std::_Select1st<std::pair<const double, double>>, 
_Compare=std::less<double>, _Alloc=std::allocator<std::pair<const 
double, double>>, _Key_compare=std::less<double>, <unnamed>=true]" at 
line 6 of "
main.cpp"

This code compiles without a problem using g++.

The result of icpc and g++ version commands give the following:

> icpc -v
icpc version 18.0.3 (gcc version 8.1.0 compatibility)

> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 
8.1.0-5ubuntu1~16.04' --with-bugurl=file:///usr/share/doc/gcc-
8/README.Bugs --enable-
languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --
with-gcc-major-version-only --program-suffix=-8 --program-
prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --
libexecdir=/usr/lib --without-included-gettext --enable-
threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --
enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-
time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object 
--disable-vtable-verify --enable-libmpx --enable-plugin --with-
system-zlib --with-target-system-zlib --enable-objc-gc=auto --
enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-
tune=generic --enable-offload-targets=nvptx-none --without-cuda-
driver --enable-checking=release --build=x86_64-linux-gnu --
host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 8.1.0 (Ubuntu 8.1.0-5ubuntu1~16.04) 

So my icpc and g++ version are compatible. I also didn't forget to source the compilervars.sh file of icpc.

I can't find any post with this error, also not on the Intel site. Is there a specific library needed to add to icpc that is not added automatically to be able to use std::map?

I've tried adding -lstdc++ myself in the compilation command but this didn't work.

Tim Diekmann
  • 7,755
  • 11
  • 41
  • 69
AndyMN
  • 61
  • 3
  • maybe you need to specify which standard of C++ you want to use : `-std=c++17` for example – Olivier Sohn Jul 04 '18 at 10:30
  • @OlivierSohn I tried this and I get the exact same errors as above. – AndyMN Jul 04 '18 at 10:34
  • I think I get it, you are using `-I/usr/include/x86_64-linux-gnu/c++/8` : then you should also specify the path to the standard library you want to use, else you're not guaranteed to have the one that corresponds to the right version. Btw what if you removed the `-I` option? – Olivier Sohn Jul 04 '18 at 10:41
  • @OlivierSohn If I remove the -I option I get the following result In file included from /usr/include/c++/8/bits/stl_tree.h(63), from /usr/include/c++/8/map(60), from main.cpp(2): /usr/include/c++/8/bits/stl_algobase.h(59): catastrophic error: cannot open source file "bits/c++config.h" #include ^ compilation aborted for main.cpp (code 4) – AndyMN Jul 04 '18 at 10:49
  • ok, this looks related? https://stackoverflow.com/questions/19660431/cannot-open-source-file-bits-cconfig-h-error-with-icpc – Olivier Sohn Jul 04 '18 at 10:53
  • Yes, and this is also where I found I had to have this -I option to the folder where the config is. But I get different errors while for that person it seems to be solved. – AndyMN Jul 04 '18 at 11:24

1 Answers1

2

The problem was answered by someone on the intel forums:

icc 18.0.3 does not support gcc-8 even though using the following bash command:

> icpc -v
icpc version 18.0.3 (gcc version 8.1.0 compatibility)

makes it seem that it does.

icc 18 support gcc 4.3 to 6.3.

To solve this without changing my default gcc version I did the following:

First I installed gcc 6 on my Ubuntu 16.04 machine:

sudo apt-get install gcc-6 g++-6

Then I added the following flag to my compiler flags:

-gxx-name=/usr/bin/g++-6

And changed the version of the include directory to 6 instead of 8:

-I /usr/include/x86_64-linux-gnu/c++/6
AndyMN
  • 61
  • 3