如何使用 CMake 进行交叉编译

时间:2021-06-11 11:32:08

标签: cmake cross-compiling

我目前有一个 Visual Studio Code 项目,我正在使用 CMake 运行我的 main.cpp 并且一切正常。我还可以从 Ubuntu 下的命令终端运行我的程序。我还设法交叉编译了一个简单的程序,但问题是我的 main.cpp 在一个大项目中。 我的问题是,是否有一种简单的方法可以为 ARM 架构(我在 x64-64 上)交叉编译我的 main.cpp。 我听说过工具链,但这些例子并不真正符合我的情况,所以我写了这个问题。我不知道如何编辑我的 CMakeLists.txt 来做到这一点。 这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.0)
project(hash VERSION 0.1.0)



FILE(GLOB srcSources src/*.cpp)


find_package(Qt5Core REQUIRED)


add_executable(hash
${srcSources}
)

target_link_libraries(hash Qt5::Core)



target_include_directories(hash PUBLIC
"${PROJECT_SOURCE_DIR}/include"

)

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以尝试创建一个 CMake 工具链文件,例如,您可以将其命名为 my_toolchain.cmake:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ARM)

set(TOOLCHAIN_PREFIX arm-linux-gnueabi-)
execute_process(
  COMMAND which ${TOOLCHAIN_PREFIX}gcc
  OUTPUT_VARIABLE BINUTILS_PATH
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

get_filename_component(ARM_TOOLCHAIN_DIR ${BINUTILS_PATH} DIRECTORY)

set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc)
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++)
set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)

set(CMAKE_SYSROOT ${ARM_TOOLCHAIN_DIR}/../arm-linux-gnueabi)
set(CMAKE_FIND_ROOT_PATH ${BINUTILS_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

然后用它来调用 CMake:

cmake -DCMAKE_TOOLCHAIN_FILE="my_toolchain.cmake" -S. -Bbin

当然你需要在你的交叉编译器的 sysroot 的 /lib 路径中安装 Qt-core