Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Build CMake-本机编译和交叉编译相同的代码_Build_Cmake_Cross Compiling_Ninja - Fatal编程技术网

Build CMake-本机编译和交叉编译相同的代码

Build CMake-本机编译和交叉编译相同的代码,build,cmake,cross-compiling,ninja,Build,Cmake,Cross Compiling,Ninja,我们正在为嵌入式ARM/Linux设备编写一个应用程序。开发是在Windows PC上执行的,使用交叉编译器、Eclipse和Ninja。CMake目前可以创建适合预期用途的构建脚本 一旦项目(通过Git)推送到服务器上,我们就可以在连接到网络的嵌入式设备上运行单元测试 我们正在尝试在设备上进行单元测试之前,先在PC上进行单元测试。这意味着使用mingwgcc进行本地构建——当然,我们不能在PC上启动ARM Linux可执行文件 即使我们切换工具链,启动CMake为Ninja重建规则集,或者创建

我们正在为嵌入式ARM/Linux设备编写一个应用程序。开发是在Windows PC上执行的,使用交叉编译器、Eclipse和Ninja。CMake目前可以创建适合预期用途的构建脚本

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

我们正在尝试在设备上进行单元测试之前,先在PC上进行单元测试。这意味着使用mingwgcc进行本地构建——当然,我们不能在PC上启动ARM Linux可执行文件

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


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

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

if (NOT CMAKE_CROSSCOMPILING)
    ....
endif()
围绕着特定的命令应该做到这一点

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

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

  • 我已将所有源代码(包括“仅交叉编译”文件)添加到库/可执行目标中
    • 我将它们标记为仅适用于PC的变体的“排除在构建之外”
    • 因此,所有源都将显示在一个IDE项目中(例如,用于搜索代码)
  • 我已将交叉编译调用添加为自定义目标
    • 我已经从默认版本中删除了它,但是您可以从IDE显式地启动它
    • 在我的例子中,它是一个外部脚本,但您也可以直接在
      命令中传递必要的调用
    • 您甚至可以使用另一个
      ExternalProject\u 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()
参考资料


您可以检查是否有问题。请参见,例如,您是否可以添加一个CMake代码示例,说明您是如何执行“运行测试可执行文件”的?是否将其添加为
add_custom_命令(目标…后期构建…
和/或使用
add_test()
?我认为在这两种情况下,只要在这个特定命令周围加一个
if(而不是CMAKE\u交叉编译)
endif()
就可以了。@Florian:在顶级的CMakeLists.txt中,只有
ADD\u子目录(UnitTests)
。然后在目录中有
ExternalProject\u Add(GMockDownload GIT\u REPOSITORY)https://github.com/google/googletest.git“…
由谁来完成其余的工作。是,
如果(不是CMAKE_交叉编译)
在这方面很有帮助。两个独立的构建目录和两次启动cmake似乎是最好的选择。这不是最佳选择,因为我得到了两个Eclipse项目,而不仅仅是两个构建配置。