Cmake交叉编译:查找工具

时间:2016-11-16 17:38:37

标签: c++ android-ndk cmake cross-compiling

我正在使用由android ndk13b制作的独立工具链。它工作正常,但要找到所有工具(链接器,归档器等),我的工具链文件中有一个非常详细的部分。 有没有办法让它更加浓缩?

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 - &gt;它从我的路径中的其他一些mingw工具链中找到了一些其他工具
  • CMAKE_FIND_ROOT_PATH设为${COMPILER_PATH}。它甚至不会在那时找到编译器。我可以通过设置编译器而不是SET(CMAKE_C_COMPILER ${COMPILER_PATH}/clang.cmd)(对于clang ++来说相同)来解决这个问题,但它仍然没有找到其他工具
  • 使用find_program尝试各种标记,尤其是ONLY_CMAKE_FIND_ROOT_PATH

请注意,我发现find_program是查找工具的唯一解决方法,因为例如以下内容无法正常工作:

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

(存档操作将失败,我可以从cmake-gui看到该变量未设置)。

1 个答案:

答案 0 :(得分:2)

最新的CMake 3.7版本让Android NDK支持变得更加容易。请参阅Kitware Increases Android Support in CMake 3.7Cross Compiling for Android

编辑:我已成功使用CMake 3.7运行测试(例如,在我的Windows PC上安装ADK到root):

<强> toolchain.cmake

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

并使用例如Ninja makefile生成器:

> 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文档中的this minimal example,该文档会将您的案例翻译成以下内容:

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_SYSTEM_NAME对于启用交叉编译至关重要。

为什么指定CMAKE_AR不起作用

关于您的CMAKE_AR问题请注意,CMake本身确实使用find_program()来查找ar.exe。由于find_program()会缓存其结果,因此您必须将CMAKE_AR预先填充为缓存变量(请参阅0013038: cannot set CMAKE_AR when cross-compiling Fortran-only project)。