如何配置CMake移除特定编译器默认编译命令中的-c选项?
问题
兼容GCC的编译器通常使用-c选项实现仅编译不链接,但TASKING TriCore编译器的-c选项作用是指定C标准(详见其官方文档第280页),因此无法兼容该用法。我已通过工具链文件指定TASKING编译器,配置代码如下:
set(CMAKE_C_COMPILER "${AURIX_SDK_ROOT}/bin/ctc" CACHE INTERNAL "") set(CMAKE_CXX_COMPILER "${AURIX_SDK_ROOT}/bin/cptc" CACHE INTERNAL "") foreach (_prefix C CXX) # 跳过自动编译器识别,强制指定为Tasking set(CMAKE_${_prefix}_COMPILER_ID "Tasking") set(CMAKE_${_prefix}_COMPILER_VERSION "6.3r1") set(CMAKE_${_prefix}_COMPILER_ID_RUN TRUE CACHE INTERNAL "") set(CMAKE_${_prefix}_COMPILER_FORCED TRUE CACHE INTERNAL "") set(CMAKE_${_prefix}_COMPILER_WORKS TRUE CACHE INTERNAL "") endforeach() set(CMAKE_AR "${AURIX_SDK_ROOT}/bin/artc") set(CMAKE_ASM_COMPILER "${AURIX_SDK_ROOT}/bin/astc") set(CMAKE_LINKER "${AURIX_SDK_ROOT}/bin/ltc") # 交叉编译路径配置 set(CMAKE_FIND_ROOT_PATH ${AURIX_SDK_ROOT}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
请问在CMake 3.16及以上版本中,如何配置才能让CMake不再使用-c选项?
版本信息
- CMake 版本 ≥3.16
- TASKING VX-toolset for TriCore v6.3r1
解决方案
CMake通过CMAKE_<LANG>_COMPILE_OBJECT变量定义编译源文件为目标文件的命令模板,默认GCC类编译器的模板包含-c选项。要适配TASKING编译器,需手动覆盖该变量,替换为TASKING对应的仅编译选项:
在工具链文件的foreach (_prefix C CXX)循环内(或循环后)添加以下配置:
foreach (_prefix C CXX) # 原有配置... # 重新定义编译命令模板,移除默认的 -c,改用TASKING的-compile选项 set(CMAKE_${_prefix}_COMPILE_OBJECT "<CMAKE_${_prefix}_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -compile <SOURCE> -o <OBJECT>" CACHE INTERNAL "") endforeach()
说明
CMAKE_<LANG>_COMPILE_OBJECT是CMake控制编译目标文件的核心变量,模板中的占位符(如<SOURCE>、<OBJECT>)会被CMake自动替换为实际文件路径- TASKING编译器使用
-compile选项实现仅编译不链接(若实际选项与文档不符,请以TASKING官方文档为准调整) - 该配置会强制CMake生成符合TASKING要求的编译命令,不再使用
-c选项
内容的提问来源于stack exchange,提问作者ilya1725
相关产品推荐
相关产品推荐

