我正在尝试设置一个工具链文件,以便与 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:“之前已报告过此问题,有人提到工具链文件不应该为更复杂的工具链设置此类内容。”
CMake 问题 398139 “工具链文件不应该设置这样的东西。...输出扩展名应该由编译器指定,或者在此处设置默认值后由 CMakeCInformation 加载的平台信息文件指定。”
关于c++ - 如何使用 CMAKE 为交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51842952/