如何指示CMake使用构建体系结构编译器

问题描述 投票:13回答:1

使用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 cross-compiling
1个回答
8
投票

CMake一次只能处理一个编译器。所以 - 如果你没有很长的路要走,将其他编译器设置为一种新语言 - 你将最终得到两个配置周期。

我看到以下方法来自动执行此过程:

  1. 以CMake页面中的"CMake Cross Compiling - Using executables in the build created during the build?"为例,我将得到: 的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() 然后使用如下脚本: build.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获得所需的结果。
  2. 拆分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}) 编译工具/的CMakeLists.txt cmake_minimum_required(VERSION 3.0) project(BuildTools) add_executable(genfoo genfoo.cpp) build.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

参考

© www.soinside.com 2019 - 2024. All rights reserved.