我正在尝试交叉编译简单的 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/