【问题标题】:How to set specific CMAKE_C_OUTPUT_EXTENSION for cross-compiling configurations with CMAKE?如何为使用 CMAKE 的交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?
【发布时间】:2018-08-14 13:43:08
【问题描述】:

我正在尝试为 CMake 3.12.0 版本的交叉编译设置一个工具链文件。

我的目标文件的扩展名不同于 Windows 上的 .obj 和 UNIX 上的 .o

因此,我将CMAKE_LANG_OUTPUT_EXTENSION 设置为.src

不幸的是,这个变量被CMakeCInformation.cmake文件覆盖在这些行中:

# some compilers use different extensions (e.g. sdcc uses .rel)
# so set the extension here first so it can be overridden by the compiler specific file
if(UNIX)
  set(CMAKE_C_OUTPUT_EXTENSION .o)
else()
  set(CMAKE_C_OUTPUT_EXTENSION .obj)
endif()

如果我评论这些行,我的配置将起作用,并且将使用正确的对象扩展。

我认为我的工具链文件已配置为使 CMake 不会执行其内部编译器检查。

这是我的工具链文件输入行的样子:

SET(CMAKE_SYSTEM_NAME Generic)

INCLUDE(CMakeForceCompiler)

SET(CMAKE_C_COMPILER_FORCED TRUE)
SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
#other compiler configuration lines here 
SET(CMAKE_C_OUTPUT_EXTENSION .src)
SET(CMAKE_ASM_OUTPUT_EXTENSION .o)
SET(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1)
SET(CMAKE_ASM_OUTPUT_EXTENSION_REPLACE 1)

我知道CMakeForceCompiler 已贬值,应该使用CMAKE_TRY_COMPILE_TARGET_TYPE,这就是两者都存在的原因。

我正在使用 -DCMAKE_TOOLCHAIN_FILE 告诉 CMake 我的工具链文件

你能帮我弄清楚我做错了什么吗?

编辑:我也试图CACHE CMAKE_C_OUTPUT_EXTENSION 的值。至少对我来说这是行不通的。

【问题讨论】:

  • 我从未这样做过,因此仅将其发布为评论。如果您在CMakeCInformation 中看到并遵循include 命令,也许您可​​以定义一个自定义平台文件,在其中覆盖这些值、命名并将其放置在遵循所需包含约定的 dir 结构中,最后更新CMAKE_MODULE_PATHinclude 实际工作的根位置。
  • 问题第三行中的CMAKE_LANG_OUTPUT_EXTENSION 应该是CMAKE_C_OUTPUT_EXTENSION(错字)吗?
  • here 给出的例子有用吗?我认为您应该删除 SET(CMAKE_C_COMPILER_FORCED TRUE) 并添加 CMAKE_FORCE_C_COMPILER 以及所需的编译器名称和 id 以进行交叉编译。

标签: c++ build cmake cmake-modules


【解决方案1】:

在 CMakeLists.txt 文件中添加 SET(CMAKE_C_OUTPUT_EXTENSION .src)project 命令不在工具链文件中。这应该会为您提供所需的行为(因为它应该覆盖 CMakeCInformation 和任何其他模块脚本设置的值)。

工具链文件用于设置编译器所在位置的基本工具链信息和一些基本设置。其他变量需要在之后通过自定义编译器或平台文件设置,可以通过CMAKE_USER_MAKE_RULES_OVERRIDE 包含。

来自 CMake 问题 18713:“这个问题之前已经报告过,并且提到工具链文件不应该在更复杂的工具链中设置这些类型的东西。”

CMake 问题 398139 “工具链文件不应设置这样的内容。...输出扩展名应由 CMakeCInformation 在此处设置默认值后加载的编译器或平台信息文件指定。”

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-11-16
  • 2012-04-29
  • 2019-06-29
  • 2011-01-21
  • 2012-10-02
  • 1970-01-01
  • 2018-03-16
  • 2016-01-29
相关资源
最近更新 更多