Вопрос:

Какая польза от LLVM в Android NDK Toolchains?

android c++ linux android-ndk toolchain

1632 просмотра

3 ответа

28 Репутация автора

Какая польза от LLVM в Android NDK Toolchains?


Небольшое резюме:

Я строил свой собственный проект с Gradlew на Ubuntu, нацеливаясь на архитектуру arm и x86_64. Похоже, что LLVM использовался для вызова C / C ++ компилятора arm-linux-androideabi-4.9, а также x86_64 (?)

Следующее извлечено из armeabi-v7a / ndkBuild_build_output.log:

/ home / mypc / Android / android-ndk-r17c / toolchains / llvm / prebuilt / linux-x86_64 / bin / clang ++ -MMD -MP -MF / home / mypc / git / android-project-1 / build / middleates / ndkBuild /debug/obj/local/armeabi-v7a/objs-debug/module-5/stream_cpp.od -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt / linux-x86_64 -fpic -ffunction-section -funwind-tables -fstack-protector-strong -Wno-invalid-аргумент командной строки ...

..и следующее извлечено из x86_64 / ndkBuild_build_output.log:

/ home / mypc / Android / android-ndk-r17c / toolchains / llvm / prebuilt / linux-x86_64 / bin / clang ++ -MMD -MP -MF / home / mypc / git / android-project-1 / build / middleates / ndkBuild /debug/obj/local/x86_64/objs-debug/module-5/stream_cpp.od -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64 -target x86_64-none-linux-android -функция-разделы -funwind-таблицы -fstack-protector-strong -fPIC -Wno-invalid-аргумент командной строки ...

  • «...» означает, что у этой однострочной команды есть длинный хвост, который я обрезал.
  • Названия личных папок и проекта были изменены.

Давайте посмотрим, что находится в папке наборов инструментов Android NDK :

myacc:~/.../android-ndk-r17c/toolchains$ tree -L 1
.
├── aarch64-linux-android-4.9
├── arm-linux-androideabi-4.9
├── llvm
├── mips64el-linux-android-4.9
├── mipsel-linux-android-4.9
├── NOTICE-MIPS
├── NOTICE-MIPS64
├── renderscript
├── x86-4.9
└── x86_64-4.9

Это довольно запутанно для меня. Я думал, что llvm - это своего рода набор инструментов, поскольку он находится здесь, рядом с другими наборами инструментов. Опять же, что на самом деле использует LLVM в Android NDK Toolchains?

Спасибо за помощь :)

Автор: Nikolas Источник Размещён: 20.02.2019 11:19

Ответы (3)


8 плюса

10089 Репутация автора

Решение

LLVM - это компилятор (бэкэнд). Используемый компилятор - Clang, который находится в каталоге llvm. (LLVM - это имя компонента Clang, который выполняет фактическую генерацию кода, то есть бэкэнд.)

Ранее NDK использовал GCC в качестве компилятора. С GCC каждая целевая архитектура (arm, aarch64, x86 и т. Д.) Имела отдельную копию GCC, созданную с этой индивидуальной настроенной целью. Clang / LLVM, с другой стороны, может использовать любую настроенную архитектуру с помощью одного исполняемого файла компилятора. Так что с Clang вы сэкономите немного места на диске, избегая иметь много отдельных исполняемых файлов компилятора. Вот почему существует только одна копия дерева каталогов llvm.

В NDK r17 доступны компиляторы GCC и Clang; Clang используется по умолчанию, но GCC по-прежнему доступен для проектов, которые еще не смогли перейти на использование Clang. В более новых версиях NDK старый GCC удаляется.

В более новых версиях NDK, даже если GCC удален, специфичные для архитектуры каталоги aarch64-linux-android-4.9по-прежнему сохраняются, поскольку GNU binutils (второстепенные инструменты, используемые в процессе сборки) все еще используются, и они также поставляются в одной копии на архитектуру (даже хотя технически они могут работать в разных архитектурах).

И что касается того, почему при сборке, например, arm также упоминается x86_64; когда вы работаете с Clang или GCC, вы запускаете исполняемый файл для своего компьютера сборки, который запускает x86_64, отсюда и prebuilt/linux-x86_64часть путей.

Автор: mstorsjo Размещён: 20.02.2019 11:50

5 плюса

5700 Репутация автора

LLVM теперь является зонтичным проектом, и он содержит несколько модульных и многократно используемых технологий компилятора и цепочки инструментов. Вы можете проверить больше деталей в Инфраструктуре Компилятора LLVM .

Для Android NDK llvm стал набором инструментов по умолчанию, так как r13b и gcc были удалены с r18b.

Согласно каталогу toolchains toolchains/llvm/prebuilt/darwin-x86_64, llvm поддерживает все ABI, то есть x86, x86_64, arm, arm64.

Вероятно, в будущих выпусках NDK будет только один llvmкаталог в toolchainsкаталоге, когда все связанные с gcc инструменты, заголовки и библиотеки полностью перенесены в llvm.

введите описание изображения здесь

Ссылки, которые могут помочь: переменная пути Android NDK для команды "strip" в цепочке инструментов сборки CMake


Обновления

Просто провел быстрый тест на разных ревизиях NDK, чтобы проверить конфигурации --gcc-toolchainи --sysrootдля кросс-компиляции.

На р16б

--target=armv7-none-linux-androideabi 
--gcc-toolchain=~/ndks/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r16b/sysroot 

На r17c

--target=armv7-none-linux-androideabi
--gcc-toolchain=~/ndks/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r17c/sysroot

На р18б

--target=armv7-none-linux-androideabi19
--gcc-toolchain=~/ndks/android-ndk-r18b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r18b/sysroot

На р19б

--target=armv7-none-linux-androideabi19 
--gcc-toolchain=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64 
--sysroot=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64/sysroot 

Как было показано выше, до NDK r19b NDK использует компилятор clang, но --gcc-toolchainи --sysrootнастраиваются как более старые пути для инструментов сборки, заголовков и библиотек.

Но, поскольку NDK r19b , --gcc-toolchainи --sysrootнастроены как новые цепочки инструментов llvm , т. toolchains/llvm/prebuilt/darwin-x86_64Е. Будут использоваться заголовочные файлы инструментов (например, ranlib, ar, strip и т. Д.) И библиотеки «версии llvm».

Также обратите внимание, что он toolchains/llvm/prebuilt/darwin-x86_64содержит поддержку всех Android ABI, то есть aarch64-linux-androidдля arm64-v8a , arm-linux-androideabiдля armeabi-v7a , i686-linux-androidдля x86 , x86_64-linux-androidдля x86_64 .

Итак, вы можете попробовать NDK r19b, если вы хотите использовать только цепочки инструментов llvm.

Автор: shizhen Размещён: 21.02.2019 06:56

0 плюса

1 Репутация автора

У меня проблема при компиляции моего кода с x86_64. Не могли бы вы помочь мне в этой проблеме при переносе i686-linux-android-g ++ Arch на x86_64-linux-android-g ++ с android-ndk20 на нативном c ++

Автор: Vishnu Prasanth Размещён: 11.08.2019 08:53
Вопросы из категории :
32x32