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

Joh*_*ith 6 c++ build cmake cmake-modules

我正在尝试设置一个工具链文件,以便与 CMake 3.12.0 版本进行交叉编译。

我的目标文件.obj与 Windows 和.oUNIX 中的扩展名不同。

因此,我将我的设置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()
Run Code Online (Sandbox Code Playgroud)

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

我认为我的工具链文件已配置为 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)
Run Code Online (Sandbox Code Playgroud)

我知道CMakeForceCompiler已折旧,CMAKE_TRY_COMPILE_TARGET_TYPE应该使用这就是为什么两者都在那里的原因。

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

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

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

Fre*_*red 2

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

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

来自 CMake 问题 18713:“这个问题之前已报告过,并且提到工具链文件不应该为更复杂的工具链设置此类内容。”

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