web-dev-qa-db-fra.com

Construire une chaîne d'outils avec cmake pour effectuer une compilation croisée pour android

gcc (GCC) 4.8.1 
Android-ndk-r9 

Bonjour,

Ma machine hôte est Fedora 19 et je veux créer une chaîne d'outils pour compiler des programmes à exécuter sur Android, plus tard, je veux étendre cela pour iOS.

J'obtiens l'erreur suivante:

Check for working C compiler: /opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -- broken

Je ne sais pas pourquoi j'obtiens cette erreur, car tout a été installé. J'ai également installé binutils-arm-linux-gnu. Cependant, c'est la première fois que je fais ce genre de choses, tellement j'ai mélangé quelque chose.

J'essaie de créer un fichier de chaîne d'outils à l'aide de cmake pour effectuer une compilation croisée afin d'exécuter des bibliothèques sur un appareil Android.

J'ai installé Android-ndk-r9 à l'emplacement suivant avec le chemin d'accès au compilateur:

/opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin

arm-linux-androideabi-addr2line
arm-linux-androideabi-ar
arm-linux-androideabi-as
arm-linux-androideabi-c++
arm-linux-androideabi-c++filt
arm-linux-androideabi-cpp
arm-linux-androideabi-elfedit
arm-linux-androideabi-g++
arm-linux-androideabi-gcc
arm-linux-androideabi-gcc-4.8
arm-linux-androideabi-gcc-ar
arm-linux-androideabi-gcc-nm
arm-linux-androideabi-gcc-ranlib
arm-linux-androideabi-gcov
arm-linux-androideabi-gdb
arm-linux-androideabi-gprof
arm-linux-androideabi-ld
arm-linux-androideabi-ld.bfd
arm-linux-androideabi-ld.gold
arm-linux-androideabi-ld.mcld
arm-linux-androideabi-nm
arm-linux-androideabi-objcopy
arm-linux-androideabi-objdump
arm-linux-androideabi-ranlib
arm-linux-androideabi-readelf
arm-linux-androideabi-run
arm-linux-androideabi-size
arm-linux-androideabi-strings
arm-linux-androideabi-strip

Mon fichier de compilation croisée est:

include(CMakeForceCompiler)

set(toolchain_path /opt/ndk/toolchains)

# Target system
set(CMAKE_SYSTEM_NAME Linux)

set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_SYSTEM_VERSION 1)

# Compiler to build for the target
set(CMAKE_C_COMPILER /opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc)

set(CMAKE_FIND_ROOT_PATH /opt/ndk/toolchains)

Je l'exécute à partir de mon répertoire build/debug avec ma chaîne d'outils dans le répertoire racine.

[ant@localhost debug]$ cmake -DCMAKE_TOOLCHAIN_FILE=arm-eabi-gcc.cmake ../..

Production

-- The C compiler identification is GNU 4.8.0
-- Check for working C compiler: /opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
-- Check for working C compiler: /opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -- broken
CMake Error at /usr/share/cmake/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler
  "/opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
  is not able to compile a simple test program.

  It fails with the following output:

   Change Dir: /home/steve/mobile_progs/linux_pjsip/build/debug/CMakeFiles/CMakeTmp

  Run Build Command:/usr/bin/gmake "cmTryCompileExec379796592/fast"

  /usr/bin/gmake -f CMakeFiles/cmTryCompileExec379796592.dir/build.make
  CMakeFiles/cmTryCompileExec379796592.dir/build

  gmake[1]: Entering directory
  `/home/steve/mobile_progs/linux_pjsip/build/debug/CMakeFiles/CMakeTmp'

  /usr/bin/cmake -E cmake_progress_report
  /home/steve/mobile_progs/linux_pjsip/build/debug/CMakeFiles/CMakeTmp/CMakeFiles
  1

  Building C object
  CMakeFiles/cmTryCompileExec379796592.dir/testCCompiler.c.o

  /opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
  -o CMakeFiles/cmTryCompileExec379796592.dir/testCCompiler.c.o -c
  /home/steve/mobile_progs/linux_pjsip/build/debug/CMakeFiles/CMakeTmp/testCCompiler.c

  Linking C executable cmTryCompileExec379796592

  /usr/bin/cmake -E cmake_link_script
  CMakeFiles/cmTryCompileExec379796592.dir/link.txt --verbose=1

  /opt/ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
  CMakeFiles/cmTryCompileExec379796592.dir/testCCompiler.c.o -o
  cmTryCompileExec379796592 -rdynamic 

  /opt/Android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:
  error: cannot open crtbegin_dynamic.o: No such file or directory


  /opt/Android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:
  error: cannot open crtend_Android.o: No such file or directory

  /opt/Android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:
  error: cannot find -lc

  /opt/Android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:
  error: cannot find -ldl

  collect2: error: ld returned 1 exit status

  gmake[1]: *** [cmTryCompileExec379796592] Error 1

  gmake[1]: Leaving directory
  `/home/steve/mobile_progs/linux_pjsip/build/debug/CMakeFiles/CMakeTmp'

  gmake: *** [cmTryCompileExec379796592/fast] Error 2

  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:4 (project)

Merci d'avance,

17
ant2009

J'ai réussi à résoudre le problème en allant d'abord sur ce site:

http://developer.Android.com/tools/sdk/ndk/index.html

Il existe un exemple d'utilisation de la chaîne d'outils autonome fournie avec NDK.

make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8

Extrait le dans mon répertoire/opt.

Et en utilisant cet exemple de fichier cmake de la chaîne d'outils

# Target system
set(CMAKE_SYSTEM_NAME  Android)

set(CMAKE_SYSTEM_VERSION 1)

# Compiler to build for the target
set(CMAKE_C_COMPILER /opt/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc)
set(CMAKE_CXX_COMPILER /opt/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-g++)

Tout a juste fonctionné après ça. Cependant, je n'ai pas pu faire fonctionner mon problème précédent. J'ai peut-être mal réglé certaines variables d'environnement sur les mauvais chemins.

J'espère que ceci aide quelqu'un d'autre.

15
ant2009

Pourquoi vous n'essayez pas cela Android-cmake . J'utilise toujours ce script et cela fonctionne assez bien. Si cette approche ne correspond pas à vos besoins, vous pouvez quand même l'utiliser comme source d'inspiration :-).

3
javier-sanz

Pour le problème d'origine de ant2009, veuillez essayer d'ajouter les lignes suivantes dans .cmake:

SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=/opt/ndk/platforms/Android-23/Arch-arm" CACHE STRING "" FORCE)

SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=/opt/ndk/platforms/Android-23/Arch-arm" CACHE STRING "" FORCE)
1
zyzytoby