2013-12-01 7 views
3

Я пытаюсь пересечь скомпилировать простой helloworld.c работать на ARM (Cortex-A5)Cross Compile helloworld.c для ARM (Cortex-A5)

Я получаю следующую ошибку

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

HW/SW: 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 (окр). Когда я повторяю $ GCC_EXEC_PREFIX, я ничего не получаю. Если это причина, кто-то может предложить, как решить проблему.

Также я ознакомился с определением -mcpu = cortex-A5. Это необходимо?

Также я сделал найти 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-разыскных- директорий

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 

Обновление 12/1/2013 Следующая проблема был разрешен путем изменения переменной CC, как предлагает Крис Стреттон

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

Как правило, вы не ссылаетесь на кросс-компилятор как 'gcc', а на' arm-linux-gnueabi-gcc', однако, если это привязка для Android, могут применяться другие соображения. –

+0

@Chris Я экспортировал путь «кросс-компилятор». Я попытался назначить полный путь к CC, но все равно получил ту же ошибку. Я также попробовал компиляцию в командной строке, давая полный путь, по-прежнему получаю ту же ошибку. –

+0

@ChrisStratton: Спасибо за подсказку, начальные проблемы были решены. –

ответ

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 
$ [email protected]:/ $ cd /data/local/tmp 
$ [email protected]:/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 

и связанные с ним, вот флагов процессора Cortex-A, рекомендованный ARM Inc. Не беспокойтесь о мультилибрах, так как 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  | 
--------------------------------------------------------------------