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
在CMake内启动主机和目标交叉编译构建_Cmake_Cross Compiling - Fatal编程技术网

在CMake内启动主机和目标交叉编译构建

在CMake内启动主机和目标交叉编译构建,cmake,cross-compiling,Cmake,Cross Compiling,是否有一种方法可以配置CMake,使单个make命令同时启动主机和目标构建?我有一个项目要在目标平台上运行,但需要从需要在主机平台(PC)上运行的生成器生成一些数据。从CMake的文档和环顾四周,我需要一个2遍的构建—首先是主机来创建生成器,然后是目标交叉编译构建。我的问题是如何通过cmakeconfigurations(不使用外部bash或python脚本)使用单个make命令启动2次构建 我知道的事情 CMake不允许在单个构建中更改工具链 几乎所有的解决方案都是:这很好,只是我需要跳过使用

是否有一种方法可以配置CMake,使单个
make
命令同时启动主机和目标构建?我有一个项目要在目标平台上运行,但需要从需要在主机平台(PC)上运行的
生成器生成一些数据。从CMake的文档和环顾四周,我需要一个2遍的构建—首先是主机来创建生成器,然后是目标交叉编译构建。我的问题是如何通过cmakeconfigurations(不使用外部bash或python脚本)使用单个
make
命令启动2次构建

我知道的事情

  • CMake不允许在单个构建中更改工具链
  • 几乎所有的解决方案都是:这很好,只是我需要跳过使用外部脚本的第二步
  • 如何区分交叉编译期间运行的内容
  • 据说可以使用CMake启动多个CMake构建
  • 把我的评论变成答案

    假设您有一个主机构建工具的
    buildTool
    子目录:

    buildTools\CMakeLists.txt

    cmake_minimum_required(VERSION 2.8)
    project(BuildTools)
    
    add_executable(genfoo genfoo.cpp)
    
    if (CMAKE_CROSSCOMPILING)
        set(_genfoo "bin/genfoo${CMAKE_EXECUTABLE_SUFFIX}")
        add_custom_command(
            OUTPUT ${_genfoo}
            COMMAND ${CMAKE_COMMAND} 
                        -DCMAKE_BUILD_TYPE:STRING="Release"
                        -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE:PATH="${CMAKE_BINARY_DIR}/bin"
                        -B"bin"
                        -H"${CMAKE_SOURCE_DIR}/buildTools"
            COMMAND ${CMAKE_COMMAND} --build bin --config Release
        )
    else()
        set(_genfoo genfoo)
        add_subdirectory(buildTools)
    endif()
    
    add_custom_command(
        OUTPUT foo.h
        COMMAND ${_genfoo}
        DEPENDS ${_genfoo}
    )
    
    add_executable(bar bar.cpp foo.h)
    target_include_directories(bar PRIVATE ${CMAKE_BINARY_DIR})
    
    然后你可以有一个主要的:

    CMakeLists.txt

    cmake_minimum_required(VERSION 2.8)
    project(BuildTools)
    
    add_executable(genfoo genfoo.cpp)
    
    if (CMAKE_CROSSCOMPILING)
        set(_genfoo "bin/genfoo${CMAKE_EXECUTABLE_SUFFIX}")
        add_custom_command(
            OUTPUT ${_genfoo}
            COMMAND ${CMAKE_COMMAND} 
                        -DCMAKE_BUILD_TYPE:STRING="Release"
                        -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE:PATH="${CMAKE_BINARY_DIR}/bin"
                        -B"bin"
                        -H"${CMAKE_SOURCE_DIR}/buildTools"
            COMMAND ${CMAKE_COMMAND} --build bin --config Release
        )
    else()
        set(_genfoo genfoo)
        add_subdirectory(buildTools)
    endif()
    
    add_custom_command(
        OUTPUT foo.h
        COMMAND ${_genfoo}
        DEPENDS ${_genfoo}
    )
    
    add_executable(bar bar.cpp foo.h)
    target_include_directories(bar PRIVATE ${CMAKE_BINARY_DIR})
    
    参考资料


    您可以随时弯曲CMake和
    make
    来基本上做任何您想做的事情。我只是想问一下,这是否值得付出努力,是否有人在看你的解决方案时仍然能够理解内部工作原理和/或找到可能的问题。例如,只需考虑一种可能的情况下的
    stdout
    /
    stderr
    输出,在这种情况下,您总是通过
    add_custom_command()
    调用进行交叉编译,并再次对主机构建执行do call
    cmake
    。太棒了!您能否详细说明
    -B
    -H
    选项以及
    bin
    参数到
    --构建
    ?在
    cmake--help
    中找不到它。它们记录在哪里?但是我发现了一个问题:
    ${CMAKE\u EXECUTABLE\u SUFFIX}“
    是当前后缀。在linux上为windows编译时,这将是(IMO)“.exe”,但生成的文件没有该后缀,因为它是在linux上编译的。