Фатальная ошибка arm-linux-gnu-gcc: stdio.h: нет такого файла или каталога

Это файлы в /usr/bin

[root@xilinx 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

Я следую этому уроку для кросс-компиляции простой программы на C:

/* 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;
}

Теперь я сохраняю это.c файл и пытаюсь скомпилировать его;

[root@xilinx 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.

Это происходит только тогда, когда я использую arm-linux-gnu-gcc.

Но когда я использую gcc, он работает нормально.

Почему arm-linux* выдает эту ошибку?

Обновить

[root@xilinx 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.

Подробный

[root@xilinx 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.

Конфигурация хоста

Redhat 6, 64 бит

2 ответа

Решение

Кажется, здесь проблема в том, что вы установили цепочку инструментов компилятора для цели, но не установили стандартную библиотеку для цели. Вам нужна стандартная библиотека C, скомпилированная специально для вашей целевой платформы. Либо найдите предварительно скомпилированный файл из того же места, где вы нашли цепочку инструментов компилятора, либо загрузите его и выполните кросс-компиляцию с помощью целевой цепочки инструментов.

Если у вас есть стандартная библиотека C для цели, используйте флаг -I (это прописная буква i), чтобы сообщить компилятору, где найти заголовочные файлы, и -L флаг, указывающий компоновщику, где искать библиотеки, и, например, -lc (это строчная буква L), чтобы указать компоновщику связываться с библиотекой. Что-то вроде

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

Это было исправлено для меня установкой "arm-none-eabi-newlib"

$ sudo yum install arm-none-eabi-newlib

Он содержал необходимые файлы в правильном пути.

Наиболее вероятная проблема в том, что при создании этого кросс-компилятора путь sysroot не был задан. У разработчиков инструментария есть свои причины для этого. Вы можете подтвердить, сделав

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

Разработчики цепочки инструментов ожидают, что мы будем использовать стандартные переменные окружения, такие как ${CXX} ${CC} для кросс-компиляции. Обычно для этого им предоставляется сценарий, который, помимо прочего, выполняет следующее.

$ 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"

Таким образом, для компиляции вашей *.c программы, в нашем случае myinit.c, вы должны это сделать.

$ ${CC} myinit.c

Или, если вы любите меня, старая школа сделает

$ arm-linux-gnu-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=$SDKTARGETSYSROOT myinit.c
Другие вопросы по тегам