gpt4 book ai didi

cmake - 如何指示 CMake 使用构建架构编译器

转载 作者:行者123 更新时间:2023-12-03 23:53:08 27 4
gpt4 key购买 nike

使用 CMake 进行交叉编译时,通常通过 CMAKE_TOOLCHAIN_FILE 指定工具链文件。选项。在 GNU terminology ,可以使用此文件指定主机架构工具集。但是,通常不能期望能够执行使用此工具链构建的任何内容。很多时候,需要为构建架构编译一些构建工具。

考虑以下设置。我有两个源文件 genfoo.cbar.c .在构建期间,genfoo.c需要编译和运行。它的输出需要写入foo.h .然后我可以编译bar.c , 其中 #include "foo.h" .由于 CMake 默认使用主机架构工具链,bar.c 的说明很容易。但是我如何告诉它使用构建架构工具链来编译 genfoo.c ?简单地说add_executable(genfoo genfoo.c)将导致使用错误的编译器。

最佳答案

CMake 一次只能处理一个编译器。所以——如果你不把其他编译器设置为一种新语言——你最终会得到两个配置周期。

我看到以下方法来自动化这个过程:

  • "CMake Cross Compiling - Using executables in the build created during the build?" 为例从 CMake 页面作为起点,我将得到:

    CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(FooBarTest)

    # When crosscompiling import the executable targets
    if (CMAKE_CROSSCOMPILING)
    set(IMPORT_PATH "IMPORTFILE-NOTFOUND" CACHE FILEPATH "Point it to the export file path from a native build")
    file(TO_CMAKE_PATH "${IMPORT_PATH}" IMPORT_PATH_CMAKE)
    include(${IMPORT_PATH_CMAKE}/genfooTargets.cmake)

    # Then use the target name as COMMAND, CMake >= 2.6 knows how to handle this
    add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h
    COMMAND genfoo
    )

    add_executable(bar bar.cpp ${CMAKE_CURRENT_BINARY_DIR}/foo.h)
    target_include_directories(bar PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
    endif()

    # Only build the generator if not crosscompiling
    if (NOT CMAKE_CROSSCOMPILING)
    add_executable(genfoo genfoo.cpp)
    export(TARGETS genfoo FILE "${CMAKE_CURRENT_BINARY_DIR}/genfooTargets.cmake")
    endif()

    然后使用如下脚本:

    构建.sh
    #!/bin/bash

    if [ ! -d hostBuild ]; then
    cmake -E make_directory hostBuild
    cmake -E chdir hostBuild cmake ..
    fi
    cmake --build hostBuild

    if [ ! -d crossBuild ]; then
    cmake -E make_directory crossBuild
    cmake -E chdir crossBuild cmake .. -DIMPORT_PATH=${PWD}/hostBuild -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
    fi
    cmake --build crossBuild

    我将通过调用 ./build.sh 获得所需的结果.
  • 拆分 CMakeLists.txt甚至可能替换 export()/include()我知道我的构建工具的输出路径的东西,例如通过使用 CMAKE_RUNTIME_OUTPUT_DIRECTORY 会简化事情:

    CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(FooBarTest)

    # Then use the target name as COMMAND. CMake >= 2.6 knows how to handle this
    add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/foo.h
    COMMAND genfoo
    )

    add_executable(bar bar.cpp ${CMAKE_CURRENT_BINARY_DIR}/foo.h)
    target_include_directories(bar PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

    buildTools/CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(BuildTools)

    add_executable(genfoo genfoo.cpp)

    构建.sh
    #!/bin/bash

    if [ ! -d crossBuild ]; then
    cmake -E make_directory crossBuild
    cmake -E chdir crossBuild cmake .. -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
    fi
    if [ ! -d hostBuild ]; then
    cmake -E make_directory hostBuild
    cmake -E chdir hostBuild cmake ../buildTools -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${PWD}/crossBuild
    fi
    cmake --build hostBuild
    cmake --build crossBuild

  • 引用文献
  • Making a CMake library accessible by other CMake packages automatically
  • CMake build multiple targets in different build directories
  • How do I make CMake output into a 'bin' dir?
  • 关于cmake - 如何指示 CMake 使用构建架构编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173840/

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