6

我正在尝试使用 CMake 3.12.0 版本设置用于交叉编译的工具链文件。

我的目标文件具有与.objWindows 和.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()

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

我认为我的工具链文件已配置为 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应该使用,这就是为什么两者都在那里。

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

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

编辑:我也在尝试CACHE. CMAKE_C_OUTPUT_EXTENSION至少对我来说这不起作用。

4

1 回答 1

2

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

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

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

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

于 2018-11-29T20:05:07.363 回答