gpt4 book ai didi

build - CMake - native 编译和交叉编译相同的代码

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

我们正在为嵌入式 ARM/Linux 设备编写应用程序。使用交叉编译器、Eclipse 和 Ninja 在 Windows PC 上进行开发。 CMake 目前可以创建可以很好地实现预期目的的构建脚本。

一旦项目被(通过 Git)推送到服务器,我们就会在连接到网络的嵌入式设备上运行单元测试。

在我们尝试在设备上运行之前,我们正在尝试实现将在 PC 上运行的单元测试。这意味着使用 MinGW GCC 在 native 构建 - 当然我们不能在 PC 上启动 ARM Linux 可执行文件。

即使我们切换工具链,启动 CMake 为 Ninja 重建规则集,或者创建两个构建目录,一个用于 PC,一个用于 ARM,问题仍然存在,CMake 将尝试运行测试可执行文件,然后在构建期间,单元测试将在 ARM 版本上尝试。

我们如何配置构建(通过 CMake)以创建两者 - 而不是尝试在 PC 上运行交叉编译的构建?

最佳答案

我在我的项目中有类似的设置(从相同的来源构建模拟器、单元测试和目标二进制文件),您可以检查 CMAKE_CROSSCOMPILING区分您的两个用例。只是放

if (NOT CMAKE_CROSSCOMPILING)
....
endif()

围绕特定命令应该可以解决问题。

并且您需要有两个二进制输出目录。 CMake 不允许在一个目录中混合工具链。

但是您不需要有两个 IDE 项目。在我的项目中:

  • 我已经添加了所有来源 - 包括。 “仅交叉编译”文件 - 进入库/可执行目标
    • 我将它们标记为“从构建中排除”,仅适用于 PC 版本
    • 因此所有资源都将显示在一个 IDE 项目中(例如,用于搜索代码)
  • 我已将交叉编译调用添加为自定义目标
    • 我已将其从默认构建中删除,但您可以从您的 IDE 中显式启动它
    • 在我的例子中,它是一个外部脚本,但您也可以直接在 COMMAND 参数中传递必要的调用
    • 您甚至可以使用另一个 ExternalProject_Add() 来包含您自己的交叉编译项目

下面是这种方法的一些代码片段:

if (NOT CMAKE_CROSSCOMPILING)
set(PC "ON" CACHE INTERNAL "hw-platform PC")
unset(MCU CACHE)
else()
set(MCU "ON" CACHE INTERNAL "hw-platform MCU")
unset(PC CACHE)
endif()

...

if (PC)
# Exclude files that only compile/work on MCU
set_source_files_properties(... PROPERTIES HEADER_FILE_ONLY 1)
endif()

...

if (PC)
add_test(...)
endif()

...

if (PC AND EXISTS "${CMAKE_SOURCE_DIR}/buildMcu.cmd")
add_custom_target(
BUILD_MCU
COMMAND buildMcu.cmd
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
set_target_properties(BUILD_MCU PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1)
endif()

引用资料

关于build - CMake - native 编译和交叉编译相同的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37410880/

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