【发布时间】:2016-07-10 11:43:12
【问题描述】:
使用 CMake 进行交叉编译时,通常通过 CMAKE_TOOLCHAIN_FILE 选项指定工具链文件。在GNU terminology 中,可以使用此文件指定主机架构工具集。但是,通常不能期望能够执行使用此工具链构建的任何内容。很多时候,需要为构建架构编译一些构建工具。
考虑以下设置。我有两个源文件genfoo.c 和bar.c。在构建期间,genfoo.c 需要编译并运行。它的输出需要写入foo.h。然后我可以编译bar.c,其中#include "foo.h"。由于 CMake 默认使用主机架构工具链,bar.c 的说明很简单。但是我如何告诉它使用构建架构工具链来编译genfoo.c?简单地说add_executable(genfoo genfoo.c) 会导致使用错误的编译器。
【问题讨论】:
-
正如您所说,在 GNU 术语中,您将使用
configure命令来指定主机架构。如果要为两个不同的主机环境构建,则必须运行configure两次。所以我看到了 CMake 的两种可能性:使用构建脚本来创建和执行所需的两个环境(参见 here)或使用 ExternalProject_Add() 并将您的CMakeLists.txt拆分为专用的子项目。 -
不,使用自动工具,您只需使用
CC_FOR_BUILD。见ax_cc_for_build。 -
好吧,不知道那个。如果我理解正确,我们谈论的是CMake Cross Compiling - Using executables in the build created during the build? 中描述的用例
-
@Florian 我相信您应该使用该链接做出回答,因为它回答了我的大部分问题。我不喜欢采用的方法,但它确实解决了手头的问题。我最初没有意识到这是一种解决方案,因为它给用户带来了(构建两次)的负担。
-
也许还可以考虑here 描述的方法,其中需要在 CMake 运行中构建可执行文件,以便它可以用于生成源代码甚至其他 CMakeLists.txt 文件。我让它在 OS X 上为 iOS 构建生成文件,所以它在实践中适用于像你这样的情况。
标签: cmake cross-compiling