2016-11-16 5 views
0

나는 android ndk13b로 만든 독립 실행 형 툴체인을 사용하고 있습니다. 그것은 잘 작동하지만 모든 툴 (링커, 아카이버 등)을 찾으려면 toolchain 파일에 매우 자세한 섹션이 있습니다. 더 응축시킬 방법이 있습니까? 작동하지 않았다 무엇Cmake 크로스 컴파일 : 찾기 도구

SET(COMPILER_PATH "<path_to_my_llvm_directory>") 

SET(CMAKE_TOOLCHAIN_PREFIX aarch64-linux-android-) #In theory should allow to find minor tools like ar and objdump, see http://stackoverflow.com/a/7032021/2436175 
find_program(CMAKE_C_COMPILER clang.cmd PATH ${COMPILER_PATH}) 
find_program(CMAKE_CXX_COMPILER clang++.cmd PATH ${COMPILER_PATH}) 
find_program(CMAKE_AR ${CMAKE_TOOLCHAIN_PREFIX}ar.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_RANLIB ${CMAKE_TOOLCHAIN_PREFIX}ranlib.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_LINKER ${CMAKE_TOOLCHAIN_PREFIX}ld.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_NM ${CMAKE_TOOLCHAIN_PREFIX}nm.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_OBJCOPY ${CMAKE_TOOLCHAIN_PREFIX}objcopy.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_OBJDUMP ${CMAKE_TOOLCHAIN_PREFIX}objdump.exe PATHS ${COMPILER_PATH}) 
find_program(CMAKE_STRIP ${CMAKE_TOOLCHAIN_PREFIX}strip.exe PATHS ${COMPILER_PATH}) 

:

  • 명시 적으로 find_program를 사용하지 않음은 -> 내가 ${COMPILER_PATH}CMAKE_FIND_ROOT_PATH 설정 내 길
  • 에있는 다른와 Mingw 툴체인에서 다른 도구를 찾습니다. 이 시점에서 컴파일러를 찾지도 못합니다. 나는 그러나, SET(CMAKE_C_COMPILER ${COMPILER_PATH}/clang.cmd)와 대신 (++ 그 소리에 대한 동일) 컴파일러를 설정하여 여전히 find_program으로 다른 도구를 I가 find_program을 발견 특히 ONLY_CMAKE_FIND_ROOT_PATH

참고

  • 시도 다양한 플래그를 찾을 수없는 것을 해결할 수 있습니다 예를 들어, 다음은 작동하지 않습니다 때문에, 도구를 찾을 수있는 유일한 해결 될 :

    SET(CMAKE_AR ${COMPILER_PATH}/${CMAKE_TOOLCHAIN_PREFIX}ar.exe 
    

    (아카이브 작업이 실패하고 난 변수가 설정되지 않은 cmake-GUI에서 볼 수있다).

  • +0

    '... cmake-gui에서 변수가 설정되지 않은 것을 볼 수 있습니다. '-'cmake-gui'는 * cached * 변수 만 표시합니다. SET (CMAKE_AR ... CACHE PATH "Archiver")'를 사용할 수 있습니다. – Tsyvarev

    +0

    "더 응축시킬 방법이 있습니까?" 좋은 결과 내길 바랄 게. Cmake는 훌륭한 도구이지만 구문 및 언어 동작은 쓰레기입니다. 키트웨어가 파이썬으로 작성하지 않은 것은 정말 수치스러운 일입니다. ( –

    +0

    @RichardHodges 파이썬은 가지고 있지만 소프트웨어를 구축 할 수 있도록 모든 동료에게 우리의 삶을 편하게 만들지 못했을 것이라고 묻습니다. 그리고 파이썬에서 "완전한 독립적 인"프로그램을 만드는 것은 쉬운 일이 아닙니다. – Antonio

    답변

    2

    최신 새로운 CMake 3.7 출시로 안드로이드 NDK 지원이 훨씬 쉬워졌습니다. Kitware Increases Android Support in CMake 3.7Cross Compiling for Android을 참조하십시오.

    편집 : 나는 성공적으로 CMake 3.7 테스트를 실행 (예를 들어 내 Windows PC에 뿌리 ADK를 설치) 한 :

    toolchain.cmake

    set(CMAKE_SYSTEM_NAME Android) 
    set(CMAKE_SYSROOT "C:/android-ndk-r13b/platforms/android-24/arch-arm64") 
    

    그리고 예를 들어, 사용을 Ninja 메이크 발생기 :

    > cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake -G "Ninja" .. 
    -- Android: Targeting API '24' with architecture 'arm64', ABI 'arm64-v8a', and processor 'aarch64' 
    -- Android: Selected GCC toolchain 'aarch64-linux-android-4.9' 
    -- The C compiler identification is GNU 4.9.0 
    -- The CXX compiler identification is GNU 4.9.0 
    

    나는 일반적으로 최소한의 툴체인 파일과 함께 좋은 경험을했습니다

    일반에서 간체 툴체인 -에서 캐시 변수를 사용하여 - 특별히 공구 경로를 지정하려면 툴체인 파일. CMAKE_SYSTEM_NAME를 지정하는 crosscompiling 수 있도록하는 것이 필수적이다

    set(CMAKE_SYSTEM_NAME Android) 
    set(CMAKE_SYSTEM_PROCESSOR arm) 
    
    set(CMAKE_C_COMPILER <path_to_my_llvm_directory>/clang.cmd) 
    set(CMAKE_C_COMPILER_TARGET aarch64-linux-android) 
    set(CMAKE_CXX_COMPILER <path_to_my_llvm_directory>/clang++.cmd) 
    set(CMAKE_CXX_COMPILER_TARGET aarch64-linux-android) 
    

    참고 :

    같은 무언가로 귀하의 경우 번역 할 것이다, CMake의 문서에서 this minimal example를 참조하십시오. CMAKE_AR를 지정하는 것은 당신의 CMAKE_AR 문제가 CMake 자체가 ar.exe을 찾기 위해 find_program()을 사용 않음을 유의하시기 바랍니다에 관한

    작동하지 않았다 왜

    . find_program()은 결과를 캐시하므로 캐시 된 변수로 CMAKE_AR을 미리 채워야합니다 (0013038: cannot set CMAKE_AR when cross-compiling Fortran-only project 참조).

    +0

    CMake 3.7의 릴리스는 내 질문과 동기화 된 것 같습니다 :). 이 매우 관련성있는 답변을 주셔서 감사합니다. 도구가 실제로 발견되었지만 CMake가 llvm을 사용하도록 설득 할 수있는 방법을 찾지 못했습니다. 충분하지 않아도 :'set (CMAKE_C_COMPILER Antonio

    +0

    내가 시도한 특정 해결 방법에서 CMake는'캐시를 삭제해야하는 변수를 변경했습니다. 구성이 다시 실행되고 일부 변수를 재설정해야 할 수 있습니다. 변수 정의에 대해 선택하는 순서와 관계없이 CMAKE_C_COMPILER = <내 전체 경로> CMAKE_CXX_COMPILER = <내 전체 경로> '변수가 변경되었습니다. – Antonio

    +0

    @Antonio 문제를 재현 할 수 있는지 확인하기 위해 최신 ADK 및 CMake 버전으로 몇 가지 테스트를 실행해야합니다. 나는 나중에 오늘 내 대답을 업데이트 할 것이다. 하지만 마지막 오류 메시지에 익숙합니다 :'CMAKE_C_COMPILER' 또는'CMAKE_CXX_COMPILER'를 바꾼다면 빈 바이너리 출력 디렉토리에서 다시 시작하는 것이 가장 좋습니다. (생성자를 다음과 같이 변경했을 때와 거의 비슷합니다. 익숙한). – Florian