arm-linux-gnu-gcc致命错误:stdio.h:没有这样的文件或目录

时间:2014-04-11 11:28:58

标签: c linux gcc cross-compiling

这些是/ 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

我正在关注this tutorial以交叉编译一个简单的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位

3 个答案:

答案 0 :(得分:7)

这里的问题似乎是您为目标安装了编译器工具链,但没有为目标安装标准库。您需要专门为目标平台编译的标准C库。要么从找到编译器工具链的同一个地方找到预编译,要么下载一个并使用目标工具链进行交叉编译。

当你有一个标准的C库用于目标时,使用标志-I(大写的大写i)来告诉编译器在哪里找到头文件,以及-L标志告诉链接器在哪里找到库,例如-lc(小写的L)告诉链接器链接库。像

这样的东西
$ arm-linux-gnu-gcc -I/usr/local/target/include myinit.c -L/usr/local/target/lib -lc

答案 1 :(得分:5)

通过安装&#34; arm-none-eabi-newlib&#34;

来解决这个问题。
$ sudo yum install arm-none-eabi-newlib

它包含正确路径中的必需文件。

答案 2 :(得分:0)

这里最可能的问题是生成此交叉编译器时未设置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