gpt4 book ai didi

c++ - CMake交叉编译:查找工具

转载 作者:行者123 更新时间:2023-12-01 14:44:44 24 4
gpt4 key购买 nike

我正在使用由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->它从我的路径中找到的其他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看到未设置变量)。

    最佳答案

    好消息是,最新的CMake 3.7版本大大简化了Android NDK支持。参见Kitware Increases Android Support in CMake 3.7Cross Compiling for Android

    编辑:我已经使用CMake 3.7成功运行了一个测试(例如,将ADK安装到Windows PC的根目录下):

    工具链.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)。

    关于c++ - CMake交叉编译:查找工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40638704/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com