交叉编译 helloworld.c 到 ARM (Cortex-A5)

标签 c linux gcc arm embedded-linux

我正在尝试交叉编译简单的 helloworld.c 以在 ARM (Cortex-A5) 上运行

出现以下错误

gcc: error trying to exec 'cc1' execvp: No such file or directory

硬件/软件:SAMA5D31处理器,Android Linux

主机:Ubuntu 12.04

生成文件

CC=/home/userid/android4sam_v4.0/cross_compile_mentor/arm-2013.05/bin/arm-none-linux-gnueabi-gcc
CFLAG=I.

helloworld:helloworld.o
     $(CC)-o helloworld helloworld.o -I.

我已经在主机上编译了程序并且工作正常。然后导出交叉编译路径,尝试编译

交叉编译路径为

/home/userid/android4sam_v4.0/cross_compiler_mentor/arm-2013.05/arm-none-linux-gnueabi/bin

另请阅读一些指向 GCC_EXEC_PREFIX (env) 的帖子。当我回显 $GCC_EXEC_PREFIX 时,我没有得到任何回复。如果这是原因,有人可以建议如何解决该问题。

我还阅读了有关定义 -mcpu=cortex-A5 的内容。有这个必要吗?

我还做了一个locate cc1发现了以下内容

/usr/lib/gcc/arm-linux-gnueabi/4.4.7/cc1
/usr/lib/gcc/arm-linux-gnueabi/4.6/cc1

我也看过Environment Variables Affecting GCC

我还阅读了一些关于“xgcc -B”的内容,我不确定这是否与解决问题有关。

gcc -print-search-dirs 的输出

install: /usr/lib/gcc/x86_64-linux-gnu/4.6/
programs: =/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-    gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/bin/
libraries: =/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/:/lib/x86_64-linux-gnu/4.6/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/4.6/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../:/lib/:/usr/lib/

下面的命令编译也没有任何问题

arm-linux-gnueabi-gcc -o serial -static serial.c

2013 年 12 月 1 日更新 按照 Chris Stratton 的建议,通过修改 CC 变量解决了以下问题

gcc: error trying to exec 'cc1' execvp: No such file or directory

最佳答案

由于您使用的是 Android,因此您可以使用 AOSP 在 NDK 中提供的工具链.

在使用 Android NDK 时,您通常只需要引入架构/平台的最小 API。对于 ARM,我认为是 android-3。您可以使用更高版本的 API,例如 android-21

下面是我的 MacBook。 NDK 是 r10d,它安装在 /opt/android-ndk-r10d/ 中。

export PATH="/opt/android-ndk-r10d/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin:$PATH"

export CPP="arm-linux-androideabi-cpp"
export CC="arm-linux-androideabi-gcc"
export LD="arm-linux-androideabi-ld"
export AR="arm-linux-androideabi-ar"
export RANLIB="arm-linux-androideabi-ranlib"

export CFLAGS="-g3 -Os -mfloat-abi=softfp -mfpu=vfpv3-d16 --sysroot=/opt/android-ndk-r10d/platforms/android-21/arch-arm"

您肯定想使用 --sysroot 以便系统知道要使用哪些 header 和库。您的另一个选择是将它与 -I-L-l 拼凑在一起。

然后:

$(CC) $(CFLAGS) -I. helloworld.c -o helloworld.exe

之后,您使用 adb 将其推送到设备并执行它。像这样的东西:

$ adb push helloworld.exe /data/local/tmp
$ adb shell
$ shell@android:/ $ cd /data/local/tmp
$ shell@android:/data/local/tmp $ ./helloworld.exe

这里有一些您应该注意的额外 CFLAGS(来自脚本中用于设置环境的个人注释):

# armeabi-v7a must use:
#   CXXFLAGS += -march=armv7-a -mfloat-abi=softfp
# armeabi-v7a with Neon must use:
#   CXXFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon
# ARMv7 needs nothing special. In fact, specifying
#   CXXFLAGS += -march=armv7 will result in a compile error.
# Cortex A8 requires a bug fix:
#   LDFLAGS += --fix-cortex-a8

与此相关的是,这里是 ARM Inc 推荐的 Cortex-A 处理器标志。不用担心 multilib,因为 Android 会为您处理。

--------------------------------------------------------------------
| ARM Core | Command Line Options                       | multilib |
|----------|--------------------------------------------|----------|
|Cortex-A* | [-mthumb] -march=armv7-a                   | armv7-ar |
|(No FP)   |                                            | /thumb   |
|----------|--------------------------------------------|----------|
|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=softfp| armv7-ar |
|(Soft FP) | -mfpu=vfpv3-d16                            | /thumb   |
|          |                                            | /softfp  |
|----------|--------------------------------------------|----------|
|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=hard  | armv7-ar |
|(Hard FP) | -mfpu=vfpv3-d16                            | /thumb   |
|          |                                            | /fpu     |
--------------------------------------------------------------------

关于交叉编译 helloworld.c 到 ARM (Cortex-A5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314558/

相关文章:

c++ - Ncurses - 如何将某些内容添加到输入缓冲区中

gcc - 在 Windows 7 x64 中安装和使用 GCC

c - 编译时出现运行时错误

c - while(foo) 与 while(foo != NULL)

c - 无法访问 svOpenArrayHandle 的维度

c++ - 文件版本信息

c - 在 linux 中使用 size 命令检查 c 程序的内存布局时出现奇怪的结果

c++ - 为 AVR 编译 c++0x

c++ - 按引用调用和按值调用之间的区别

c - C语言支持继承吗?