切换至CMake编译OS汇编代码时添加无效选项的问题求助
解决CMake交叉编译OS时汇编器参数错误的问题
问题根源
CMake默认将汇编编译流程与GCC绑定,自动添加了依赖跟踪相关参数(-MM、-MD、-MF等),但这些是GCC的专属参数,独立的i686-elf-as汇编器并不支持,因此触发了invalid option -- 'F'的错误。
解决方法
方法1:用GCC驱动汇编(推荐)
将汇编编译器指定为交叉GCC而非独立的as,GCC会自动处理依赖参数并调用as完成汇编,同时兼容所有CMake的自动流程:
- 修改工具链文件中的
CMAKE_ASM_COMPILER设置:set(CMAKE_ASM_COMPILER ${BINUTILS_PATH}/${TOOLCHAIN_PREFIX}gcc) - 确保汇编源文件的后缀为
.S(大写),这样GCC会先预处理再汇编;如果用小写.s,GCC会直接调用as,也能正常工作。
方法2:完全自定义汇编编译命令
如果需要严格控制汇编命令的每一个字符,可以直接覆盖CMake的ASM编译规则:
# 全局覆盖所有ASM文件的编译命令 set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> <SOURCE> -o <OBJECT>") # 或者仅针对内核汇编源文件设置 set_source_files_properties(${KERNEL_ASM_SOURCES} PROPERTIES COMPILE_COMMAND "${CMAKE_ASM_COMPILER} <SOURCE> -o <OBJECT>" )
这样CMake会完全按照你指定的命令编译汇编文件,不会添加任何额外参数。
方法3:禁用ASM的依赖跟踪(不推荐)
如果坚持使用独立的as,可以关闭CMake对ASM文件的依赖自动生成:
set(CMAKE_DEPENDS_USE_COMPILER OFF)
但该方法会影响所有语言的依赖生成,可能导致后续构建的依赖关系不准确,仅适合简单项目临时使用。
验证修改效果
修改后重新生成构建文件并编译,汇编命令会变为你期望的最简形式:
i686-elf-as input.s -o input.s.obj
内容的提问来源于stack exchange,提问作者Jacques
相关产品推荐
相关产品推荐

