arm-linux-gnu-gcc fatal error: stdio.h: No such file or directory

37,543

Solution 1

The problem here, it seems, is that you installed the compiler toolchain for the target, but didn't install a standard library for the target. You need a standard C library compiled specifically for your target platform. Either find a pre-compiled from the same place you found the compiler toolchain, or download one and cross-compile using the target toolchain.

When you have a standard C library for the target, use the flag -I (that's uppercase i) to tell the compiler where to find the header files, and the -L flag to tell the linker where to find the libraries, and e.g. -lc (that's the lower-case L) to tell the linker to link with the library. Something like

$ arm-linux-gnu-gcc -I/usr/local/target/include myinit.c -L/usr/local/target/lib -lc

Solution 2

This got fixed for me by installing "arm-none-eabi-newlib"

$ sudo yum install arm-none-eabi-newlib

It contained the required files in the right path.

Solution 3

The most likely issue here is that the sysroot path wasn't set when this cross compiler was generated. The toolchain developers have their own reasons for doing so. You can confirm by doing

$ arm-linux-gnu-gcc -print-sysroot
 /not/exist

The toolchain developers expect us to use the standard environment variables such as ${CXX} ${CC} to cross compile. They would usually have a script provided for this purpose that among other things does the following.

$ export SDKTARGETSYSROOT=/path/to/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
$ export CC="arm-linux-gnu-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=$SDKTARGETSYSROOT"

So, for compiling your *.c program, in this case, myinit.c, you would do.

$ ${CC} myinit.c

Or if you like me are old school would do

$ arm-linux-gnu-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=$SDKTARGETSYSROOT myinit.c
Share:
37,543

Related videos on Youtube

gpuguy
Author by

gpuguy

Updated on July 17, 2022

Comments

  • gpuguy
    gpuguy 5 months

    These are the files in /usr/bin

    [[email protected] bin]# ls -ld arm*
    -rwxr-xr-x. 1 root root  691752 Feb  5  2013 arm-linux-gnu-addr2line
    -rwxr-xr-x. 1 root root  721416 Feb  5  2013 arm-linux-gnu-ar
    -rwxr-xr-x. 1 root root 1297632 Feb  5  2013 arm-linux-gnu-as
    -rwxr-xr-x. 1 root root  689168 Feb  5  2013 arm-linux-gnu-c++filt
    -rwxr-xr-x. 1 root root  545664 Feb  6  2013 arm-linux-gnu-cpp
    -rwxr-xr-x. 1 root root   34176 Feb  5  2013 arm-linux-gnu-elfedit
    -rwxr-xr-x. 1 root root  544624 Feb  6  2013 arm-linux-gnu-gcc
    -rwxr-xr-x. 1 root root  214400 Feb  6  2013 arm-linux-gnu-gcov
    -rwxr-xr-x. 1 root root  760640 Feb  5  2013 arm-linux-gnu-gprof
    -rwxr-xr-x. 2 root root 1177528 Feb  5  2013 arm-linux-gnu-ld
    -rwxr-xr-x. 2 root root 1177528 Feb  5  2013 arm-linux-gnu-ld.bfd
    -rwxr-xr-x. 1 root root  704672 Feb  5  2013 arm-linux-gnu-nm
    -rwxr-xr-x. 1 root root  875456 Feb  5  2013 arm-linux-gnu-objcopy
    -rwxr-xr-x. 1 root root 1096992 Feb  5  2013 arm-linux-gnu-objdump
    -rwxr-xr-x. 1 root root  721456 Feb  5  2013 arm-linux-gnu-ranlib
    -rwxr-xr-x. 1 root root  389040 Feb  5  2013 arm-linux-gnu-readelf
    -rwxr-xr-x. 1 root root  693608 Feb  5  2013 arm-linux-gnu-size
    -rwxr-xr-x. 1 root root  691648 Feb  5  2013 arm-linux-gnu-strings
    -rwxr-xr-x. 1 root root  875456 Feb  5  2013 arm-linux-gnu-strip
    

    I am following this tutorial to cross compile a simple C program:

    /* myinit.c
     * Build instructions:
     * ${CROSS_COMPILE}gcc -static init.c -o init
     * */
    #include <stdio.h>
    int
    main ()
    {
        printf ("\n");
        printf ("Hello world from %s!\n", __FILE__);
        while (1) { }
        return 0;
    }
    

    Now I save this is a .c file and try to compile it;

    [[email protected] Xilinx-ZC702-14.7]# arm-linux-gnu-gcc myinit.c 
    myinit.c:6:19: fatal error: stdio.h: No such file or directory
    compilation terminated.
    

    This is hapening only when I am using arm-linux-gnu-gcc.

    But when I am using gcc, it works fine.

    Why is arm-linux* giving this error?

    Update

    [[email protected] Xilinx-ZC702-14.7]# arm-linux-gnu-cpp -Wp,-v
    ignoring nonexistent directory "/usr/lib/gcc/arm-linux-gnueabi/4.7.2/../../../../arm-linux-gnueabi/sys-include"
    ignoring nonexistent directory "/usr/lib/gcc/arm-linux-gnueabi/4.7.2/../../../../arm-linux-gnueabi/include"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/lib/gcc/arm-linux-gnueabi/4.7.2/include
     /usr/lib/gcc/arm-linux-gnueabi/4.7.2/include-fixed
    End of search list.
    

    Verbose

    [[email protected] Xilinx-ZC702-14.7]# arm-linux-gnu-gcc -v myinit.c 
    Using built-in specs.
    COLLECT_GCC=arm-linux-gnu-gcc
    COLLECT_LTO_WRAPPER=/usr/libexec/gcc/arm-linux-gnueabi/4.7.2/lto-wrapper
    Target: arm-linux-gnueabi
    Configured with: ../gcc-4.7.2-20121114-aarch64/configure --disable-dependency-tracking --disable-silent-rules --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --target=arm-linux-gnueabi --enable-targets=all --program-prefix=arm-linux-gnu- --enable-languages=c --with-newlib --without-headers --disable-sjlj-exceptions --with-system-libunwind --disable-nls --disable-threads --disable-shared --disable-libmudflap --disable-libssp --disable-libgomp --disable-libquadmath --disable-gold --disable-decimal-float --enable-checking= --enable-gnu-unique-object --enable-linker-build-id --disable-plugin --enable-nls --with-system-zlib --with-bugurl=http://bugzilla.redhat.com/bugzilla/ --enable-obsolete
    Thread model: single
    gcc version 4.7.2 20121105 (Red Hat 4.7.2-2.aa.20121114svn) (GCC) 
    COLLECT_GCC_OPTIONS='-v' '-mtls-dialect=gnu'
     /usr/libexec/gcc/arm-linux-gnueabi/4.7.2/cc1 -quiet -v myinit.c -quiet -dumpbase myinit.c -mtls-dialect=gnu -auxbase myinit -version -o /tmp/ccZNNlzj.s
    GNU C (GCC) version 4.7.2 20121105 (Red Hat 4.7.2-2.aa.20121114svn) (arm-linux-gnueabi)
        compiled by GNU C version 4.4.6 20120305 (Red Hat 4.4.6-4), GMP version 4.3.1, MPFR version 2.4.1, MPC version 0.8
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    ignoring nonexistent directory "/usr/lib/gcc/arm-linux-gnueabi/4.7.2/../../../../arm-linux-gnueabi/sys-include"
    ignoring nonexistent directory "/usr/lib/gcc/arm-linux-gnueabi/4.7.2/../../../../arm-linux-gnueabi/include"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/lib/gcc/arm-linux-gnueabi/4.7.2/include
     /usr/lib/gcc/arm-linux-gnueabi/4.7.2/include-fixed
    End of search list.
    GNU C (GCC) version 4.7.2 20121105 (Red Hat 4.7.2-2.aa.20121114svn) (arm-linux-gnueabi)
        compiled by GNU C version 4.4.6 20120305 (Red Hat 4.4.6-4), GMP version 4.3.1, MPFR version 2.4.1, MPC version 0.8
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    Compiler executable checksum: a19a7c6897fa348d9d5b59c718fa0648
    myinit.c:6:19: fatal error: stdio.h: No such file or directory
    compilation terminated.
    

    Host configuration

    Redhat 6, 64 bit

    • mvw
      mvw over 8 years
      Looks like you need to specify a dir where stdio.h can be included via the -I dir option to the compiler.
    • auselen
      auselen over 8 years
      try to find where the stdio.h etc lays and uses gcc's sysroot to pass location.
    • Some programmer dude
      Some programmer dude over 8 years
      @gpuguy The files in /usr/include and /usr/lib are for the host platform, which may not be the same as the target platform.
  • Richard
    Richard about 5 years
    So it's not possible to build a cross-compiler without... a cross compiler?

Related