【发布时间】: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_PATH与include实际工作的根位置。 -
问题第三行中的
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