Search code examples
c++linuxgcccygwincross-compiling

cross-compilation with GCC fails under CYGWIN when <iostream> is included


I've built the cross toolchain for Linux under CYGWIN environment using the article at https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/ as a source.

Compilation and installation finished with success.

Used components are:

  • binutils-2.35
  • cloog-0.18.1
  • gcc-10.2.0
  • glibc-2.32
  • gmp-6.1.2
  • isl-0.20
  • linux-5.9.3
  • mpc-1.1.0
  • mpfr-4.0.2

GCC is configured as:

$ x86_64-unknown-linux-gnu-g++ --verbose
Using built-in specs.
COLLECT_GCC=x86_64-unknown-linux-gnu-g++
COLLECT_LTO_WRAPPER=/opt/cross/x86_64-unknown-linux-gnu/libexec/gcc/x86_64-unknown-linux- 
gnu/10.2.0/lto-wrapper.exe
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-10.2.0/configure --prefix=/opt/cross/x86_64-unknown-linux-gnu -- 
target=x86_64-unknown-linux-gnu --enable-languages=c,c++ --disable-nls --disable-multilib --with- 
headers=/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/linux
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (GCC)

But when I'm trying to compile the simple Hello World application that includes I'm getting a lot of different errors:

$ x86_64-unknown-linux-gnu-g++ main.cpp
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr-default.h:35,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr.h:148,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/atomicity.h:35,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:39,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:240:34: error: 'clockid_t' has not been declared
  240 |                                  clockid_t __clockid,
      |                                  ^~~~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:375:12: error: 'cpu_set_t' does not name a type
  375 |      const cpu_set_t *__cpuset)
      |            ^~~~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:382:6: error: 'cpu_set_t' has not been declared
  382 |      cpu_set_t *__cpuset)
      |      ^~~~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:466:14: error: 'cpu_set_t' does not name a type
  466 |        const cpu_set_t *__cpuset)
      |              ^~~~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:471:8: error: 'cpu_set_t' has not been declared
  471 |        cpu_set_t *__cpuset)
      |        ^~~~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:765:9: error: 'clockid_t' has not been declared
  765 |         clockid_t __clockid,
      |         ^~~~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:911:12: error: 'clockid_t' has not been declared
  911 |            clockid_t __clockid,
      |            ^~~~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:933:12: error: 'clockid_t' has not been declared
  933 |            clockid_t __clockid,
      |            ^~~~~~~~~
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr.h:148,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/atomicity.h:35,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:39,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr-default.h:114:1: error: 'sched_yield' was not declared in this scope; did you mean 'pthread_yield'?
  114 | __gthrw(sched_yield)
      | ^~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr-default.h:114:1: error: 'sched_yield' was not declared in this scope; did you mean 'pthread_yield'?
  114 | __gthrw(sched_yield)
      | ^~~~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr-default.h: In function 'int __gthread_yield()':
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr-default.h:693:33: error: '__gthrw_sched_yield' cannot be used as a function
  693 |   return __gthrw_(sched_yield) ();
      |                                 ^
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/sys/select.h:37,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/sys/types.h:179,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/stdlib.h:394,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/cstdlib:75,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:41,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/basic_string.h:6535,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/string:55,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/locale_classes.h:40,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:41,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/bits/types/struct_timeval.h: At global scope:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/bits/types/struct_timeval.h:8:8: error: redefinition of 'struct timeval'
    8 | struct timeval
      |        ^~~~~~~
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/pthread.h:23,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr-default.h:35,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/gthr.h:148,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/atomicity.h:35,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:39,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sys-include/time.h:16:8: note: previous definition of 'struct timeval'
   16 | struct timeval {
      |        ^~~~~~~
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:44,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/basic_string.h:6535,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/string:55,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/locale_classes.h:40,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:41,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h: In constructor '__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...)::_Save_errno::_Save_errno()':
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:63:27: error: 'errno' was not declared in this scope
   63 |  _Save_errno() : _M_errno(errno) { errno = 0; }
      |                           ^~~~~
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/basic_string.h:6535,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/string:55,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/locale_classes.h:40,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:41,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:45:1: note: 'errno' is defined in header '<cerrno>'; did you forget to '#include <cerrno>'?
   44 | #include <cerrno>
  +++ |+#include <cerrno>
   45 |
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:44,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/basic_string.h:6535,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/string:55,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/locale_classes.h:40,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:41,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h: In destructor '__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...)::_Save_errno::~_Save_errno()':
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:64:23: error: 'errno' was not declared in this scope
   64 |  ~_Save_errno() { if (errno == 0) errno = _M_errno; }
      |                       ^~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:64:23: note: 'errno' is defined in header '<cerrno>'; did you forget to '#include <cerrno>'?
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h: In function '_Ret __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...)':
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:84:16: error: 'errno' was not declared in this scope
   84 |       else if (errno == ERANGE
      |                ^~~~~
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ext/string_conversions.h:84:16: note: 'errno' is defined in header '<cerrno>'; did you forget to '#include <cerrno>'?
In file included from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/system_error:39,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/bits/ios_base.h:46,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ios:42,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/ostream:38,
                 from /opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/iostream:39,
                 from main.cpp:1:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/error_constants.h: At global scope:
/opt/cross/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/10.2.0/x86_64-unknown-linux-gnu/bits/error_constants.h:122:27: error: 'ENOTSUP' was not declared in this scope
  122 |       not_supported =     ENOTSUP,
      |   

UPD: WSL and virtual machines are not an option in my case


Solution

  • I've managed to solve the issue.

    The problem was in the sys-include directory
    opt/cross/x86_64-unknown-linux-gnu/sys-include

    This directory has include files with the same names as the ones from
    opt/cross/x86_64-unknown-linux-gnu/include
    but with different content.

    The sys-include directory was searched by the compiler before the regular include.

    Renaming or removing sys-include solves the issue and code can be compiled.

    I don't know the purpose of the sys-include directory, when it was created and why the duplicated files in this directory have another content.

    Accepting my own post as answer to indicate that the issue can be solved.