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

3

我正在尝试将一个简单的helloworld.c程序交叉编译为在ARM(Cortex-A5)上运行。

但我遇到了以下错误:

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

硬件/软件: SAMA5D31处理器,Android Linux操作系统

主机: Ubuntu 12.04

Makefile

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(环境变量)的帖子。当我输入echo $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

我也看了关于“影响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

3
通常情况下,人们会使用 arm-linux-gnueabi-gcc 而不是 gcc 作为交叉编译器。但如果这是一个 Android 工具链,则可能需要考虑其他因素。 - Chris Stratton
@Chris 我导出了“交叉编译器路径”。我尝试将完整路径分配给CC,但仍然得到相同的错误。我还尝试在命令提示符处编译并给出完整路径,但仍然得到相同的错误。 - Mahendra Gunawardena
2
基本上,你的工具链已经损坏了。请考虑使用openembedded或yocto。 - Ottavio Campana
是因为调用了 arm-none-linux-gnueabi-gcc 而非 arm-linux-gnueabi-gcc 导致的吗? - mangusta
1
@mangusta - 基本上是工具链出了问题。在主机上编译时一切正常,但是交叉编译到目标时却无法工作。因此,必须将工具链指向交叉编译工具链。我使用的是Mentor的CodeSourcery。希望对你有所帮助。 - Mahendra Gunawardena
显示剩余4条评论
1个回答

1

由于您正在使用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,这样系统就知道要使用哪些头文件和库。您的另一个选择是使用 -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公司推荐的Cortex-A处理器标志。不必担心多库,因为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     |
--------------------------------------------------------------------

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接