2013-10-13 4 views
16
gcc (GCC) 4.8.1 
android-ndk-r9 

Здравствуйте,Построение набора инструментов с CMake для кросс-компиляции для андроид

Мой хозяин машины Fedora 19 и я хочу, чтобы создать набор инструментов для компиляции программ для запуска на андроид, позже я хочу продлить это для iOS.

я получаю следующее сообщение об ошибке:

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

Я не знаю, почему я получаю эту ошибку, как было все установлено. Я также установил binutils-arm-linux-gnu. Тем не менее, это мой первый раз делать такие вещи, поэтому у меня кое-что перепуталось.

Я пытаюсь создать файл toolchain с помощью cmake для компиляции croos для запуска библиотек на устройстве Android.

Я установил андроид-NDK-R9 в следующем месте с пути к компилятору:

/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 

Мой кросс-компиляции файла:

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) 

Я бегу это от моего build/debug, с моей привязкой в ​​корневой директории.

[[email protected] debug]$ cmake -DCMAKE_TOOLCHAIN_FILE=arm-eabi-gcc.cmake ../.. 

Выход

-- 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) 

Большое спасибо заранее,

ответ

11

мне удалось решить эту проблему, первым идти на этот сайт:

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

Существует пример использования автономного набора инструментов, который поставляется с НДК.

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

Извлечен в каталог my/opt.

И используя этот пример набора инструментов Cmake файл

# 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++) 

Все просто работал после этого. Однако я не мог заставить свою предыдущую проблему работать. Возможно, я неправильно установил некоторые переменные среды для неправильных путей.

Надеюсь, это поможет кому-то еще.

+0

Благодаря это работало нормально. Как насчет установки 'CMAKE_SYSTEM_NAME' в Linux, хотя - в случае, если некоторые проверки конфигурации проверяют это? –

3

Почему вы не попробовать этот android-cmake. Я все еще использую этот скрипт, и он работает достаточно хорошо. Если этот подход не соответствует вашим потребностям, вы можете использовать его как вдохновение в любом случае :-).

1

Для исходной задачи из ant2009, пожалуйста, попробуйте добавить следующие строки в .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)