我正在使用由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看到该变量未设置)。
答案 0 :(得分:2)
最新的CMake 3.7版本让Android NDK支持变得更加容易。请参阅Kitware Increases Android Support in CMake 3.7和Cross 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)。