如何使用 CMAKE 为交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?

How to set specific CMAKE_C_OUTPUT_EXTENSION for cross-compiling configurations with CMAKE?

我正在尝试设置一个工具链文件,以便与 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 的值。至少对我来说这是行不通的。

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

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

包含

来自 CMake 问题 18713:"This issue has been reported before and it was mentioned that the toolchain file isn't where these kinds of things should be set for more complicated toolchains."

CMake 问题 398139 "Toolchain files should not be setting things like this. ... The output extension should be specified by compiler or platform information files that are loaded by CMakeCInformation after the defaults here are set."