Search code examples
c++boosticc

Why does an extra -I flag (include directory) break compilation? (using Intel Compiler)


I installed a trial version of Intel ComposerXE 2013 (contains ICC 14.0.1 compiler). My test program is follows:

#include <boost/graph/adjacency_list.hpp>
#include <iostream>

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> UndirectedGraph;

int main() {

  UndirectedGraph G(10);

return 0;  
}

I compile the code using intel compiler flags as follows

/home/intel/bin/icpc                                 //binary
   -L/home/intel/composerxe/lib/intel64              //lib path
   -I/home/intel/composerxe/include                  //include path for ICPC
   -I/home/boost_1_55_0                              //boost path
   -std=c++11 test.cpp                              //  c++11 flags 

I get the below error for BOOST HASH.hpp and type_traits.hpp files

In file included from /home/boost_1_55_0/boost/functional/hash/hash.hpp(540),
                 from /home/boost_1_55_0/boost/functional/hash.hpp(6),
                 from /home/boost_1_55_0/boost/unordered/unordered_set.hpp(20),
                 from /home/boost_1_55_0/boost/unordered_set.hpp(16),
                 from /home/boost_1_55_0/boost/graph/adjacency_list.hpp(21),
                 from test.cpp(1):
/home/boost_1_55_0/boost/functional/hash/extensions.hpp(67): error: "hash_value" is not a function or static data member
      std::size_t hash_value(std::complex<T> const&);
                  ^

In file included from /home/boost_1_55_0/boost/functional/hash/hash.hpp(540),
                 from /home/boost_1_55_0/boost/functional/hash.hpp(6),
                 from /home/boost_1_55_0/boost/unordered/unordered_set.hpp(20),
                 from /home/boost_1_55_0/boost/unordered_set.hpp(16),
                 from /home/boost_1_55_0/boost/graph/adjacency_list.hpp(21),
                 from test.cpp(1):
/home/boost_1_55_0/boost/functional/hash/extensions.hpp(121): error: "hash_value" is not a function or static data member
      std::size_t hash_value(std::complex<T> const& v)
                  ^

In file included from /home/boost_1_55_0/boost/functional/hash/hash.hpp(540),
                 from /home/boost_1_55_0/boost/functional/hash.hpp(6),
                 from /home/boost_1_55_0/boost/unordered/unordered_set.hpp(20),
                 from /home/boost_1_55_0/boost/unordered_set.hpp(16),
                 from /home/boost_1_55_0/boost/graph/adjacency_list.hpp(21),
                 from test.cpp(1):
/home/boost_1_55_0/boost/functional/hash/extensions.hpp(277): warning #12: parsing restarts here after previous syntax error
      };
       ^

In file included from /home/boost_1_55_0/boost/type_traits.hpp(49),
                 from /home/boost_1_55_0/boost/pending/property.hpp(13),
                 from /home/boost_1_55_0/boost/graph/graph_traits.hpp(27),
                 from /home/boost_1_55_0/boost/graph/adjacency_list.hpp(33),
                 from test.cpp(1):
/home/boost_1_55_0/boost/type_traits/is_complex.hpp(23): error #303: explicit type is missing ("int" assumed)
     is_convertible_from_tester(const std::complex<T>&);
                                      ^

In file included from /home/boost_1_55_0/boost/type_traits.hpp(49),
                 from /home/boost_1_55_0/boost/pending/property.hpp(13),
                 from /home/boost_1_55_0/boost/graph/graph_traits.hpp(27),
                 from /home/boost_1_55_0/boost/graph/adjacency_list.hpp(33),
                 from test.cpp(1):
/home/boost_1_55_0/boost/type_traits/is_complex.hpp(23): error: qualified name is not allowed
     is_convertible_from_tester(const std::complex<T>&);
                                      ^

In file included from /home/boost_1_55_0/boost/type_traits.hpp(49),
                 from /home/boost_1_55_0/boost/pending/property.hpp(13),
                 from /home/boost_1_55_0/boost/graph/graph_traits.hpp(27),
                 from /home/boost_1_55_0/boost/graph/adjacency_list.hpp(33),
                 from test.cpp(1):
/home/boost_1_55_0/boost/type_traits/is_complex.hpp(23): error: expected a ")"
     is_convertible_from_tester(const std::complex<T>&);
                                                  ^

In file included from /home/boost_1_55_0/boost/type_traits.hpp(49),
                 from /home/boost_1_55_0/boost/pending/property.hpp(13),
                 from /home/boost_1_55_0/boost/graph/graph_traits.hpp(27),
                 from /home/boost_1_55_0/boost/graph/adjacency_list.hpp(33),
                 from test.cpp(1):
/home/boost_1_55_0/boost/type_traits/is_complex.hpp(22): warning #488: template parameter "T" is not used in declaring the parameter types of function template "boost::detail::is_convertible_from_tester::is_convertible_from_tester"
     template <class T>
                     ^

Now I compile using this without the ICPC INCLUDE PATH

/home/intel/bin/icpc                                 //binary
   -L/home/intel/composerxe/lib/intel64              //lib path
                  //removed the ICPC INCLUDE PATH HERE 
   -I/home/boost_1_55_0                              //boost path
   -std=c++11 test.cpp                               // c++11 flags 

And this compiles just fine with ZERO Errors

Why is this happening ?

My LD_LIBRARY_PATH and PATH variables are null. there is no GCC or any other compiler whose path is set. I am giving all the paths during compiling.


Solution

  • Probably there are some file in the given directory that has the same name that some other file, and when it is #included, the compilation will fail or succeed depending on which files of these two of the same name is chosen.

    To verify that this is the case, compile both cases with the option -H, it will list all the included files, and compare the output.

    To solve the issue without removing the directory, move it to the end of the command line:

    /home/intel/bin/icpc                                 //binary
       -L/home/intel/composerxe/lib/intel64              //lib path
       -I/home/boost_1_55_0                              //boost path
       -I/home/intel/composerxe/include                  //include path for ICPC
       -std=c++11 test.cpp                              //  c++11 flags