【问题标题】:How to cross-compile with CMake如何使用 CMake 进行交叉编译
【发布时间】:2021-06-11 11:32:08
【问题描述】:

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

)

感谢您的帮助

【问题讨论】:

  • 为什么说工具链文件不符合你的情况?
  • @xev 抱歉,如果我解释错了,我的意思是我不知道如何编写这些工具链文件,而且我复制/粘贴的文件都没有工作。这就是为什么我现在不知道该怎么办
  • 你用的是什么交叉编译器?
  • @xev 我正在使用 gcc/g++
  • 交叉编译器的实际名称,例如:arm-none-eabi-gcc。 gcc 本身不是交叉编译器,不像 clang 可以传递目标选项

标签: cmake cross-compiling


【解决方案1】:

您可以尝试创建一个 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

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

【讨论】:

  • 我的文件夹项目包含文件夹“build”、“src”、“include”和文件 CMakeLists.txt 。我在文件夹项目中添加了 my_toolchain.cmake,对吗?我的 main.cpp 在文件夹 src 中,我尝试在路径 Desktop/project 中执行命令,我应该在 Desktop/project/build 中执行吗?抱歉,我正在努力理解这些问题
  • 您可以像通常使用 CMake 构建项目一样执行此操作,只是添加了 `-DCMAKE_TOOLCHAIN_FILE="/path/to/my_toolchain.cmake"。确保为您的架构安装了正确的 Qt Core
  • 当我这样做时,我有这个错误(是的 qt 已安装): ``` my_toolchain.cmake:11 处的 CMake 错误(get_filename_component):get_filename_component 调用的参数数量不正确调用堆栈(大多数最近通话第一):/usr/share/cmake-3.16/Modules/CMakeDetermineSystem.cmake:93(包括)CMakeLists.txt:2(项目)my_toolchain.cmake:11处的CMake错误(get_filename_component):get_filename_component调用的数量不正确参数调用堆栈(最近调用优先):bi/CMakeFiles/3.16.3/CMakeSystem.cmake:6(包括)CMakeLists.txt:2(项目)```
  • 这是错误的第二部分: -- The CXX compiler Identification is unknown CMakeLists.txt:2 (project) 处的 CMake 错误:The CMAKE_C_COMPILER: arm-linux-gnueabi-gccgcc is not a完整路径,但未在 PATH 中找到。通过将环境变量“CC”或 CMake 缓存条目 CMAKE_C_COMPILER 设置为编译器的完整路径或编译器名称(如果它在 PATH 中),告诉 CMake 在哪里可以找到编译器。
  • 你能更新文件吗,我改变了内容
猜你喜欢
  • 1970-01-01
  • 2012-10-02
  • 2014-05-31
  • 2022-07-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多