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

时间:2018-08-14 13:43:09

标签: c++ build cmake cmake-modules

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

1 个答案:

答案 0 :(得分:1)

您没有做错任何事情。在SET(CMAKE_C_OUTPUT_EXTENSION .src)命令之后(不在工具链文件中)在CMakeLists.txt文件中添加project。这应该为您提供所需的行为(因为它应该覆盖CMakeCInformation和任何其他模块脚本设置的值)。这可能是在使用工具链文件和CMakeCInformation时的疏忽,它可能不应覆盖工具链的值。您应该访问CMake网站并提交错误报告。