如何使用cl.exe将.i预处理文件转换为.asm汇编文件
测试用C代码
#include <stdio.h> int main(){ printf("this a test"); return 0; }
问题场景
已通过cl /P code.c成功生成预处理文件code.i,但尝试将code.i转换为汇编文件时,使用以下两个命令均报错:
错误命令1:cl /Fa code.asm code.i
错误输出:
Microsoft (R) C/C++ Optimizing Compiler Version 19.20.27508.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.cl : Command line warning D9024 : unrecognized source file type 'code.as', object file assumed
cl : Command line warning D9024 : unrecognized source file type 'code.i', object file assumed
Microsoft (R) Incremental Linker Version 14.20.27508.1
Copyright (C) Microsoft Corporation. All rights reserved./out:code.exe
code.asm
code.i
LINK : fatal error LNK1181: cannot open input file 'code.asm'
错误命令2:cl /Fa code.i
错误输出:
cl /Fa code.i Microsoft (R) C/C++ Optimizing Compiler Version
19.20.27508.1 for x86 Copyright (C) Microsoft Corporation. All rights reserved.cl : Command line warning D9024 : unrecognized source file type
'code.i', object file assumed Microsoft (R) Incremental Linker Version
14.20.27508.1 Copyright (C) Microsoft Corporation. All rights reserved./out:code.exe code.i code.i : fatal error LNK1107: invalid or corrupt
file: cannot read at 0x321AD
解决方法
问题根源有两点:
- cl.exe默认不识别
.i文件为C源文件,需强制指定文件类型 /Fa参数的正确用法是直接紧跟汇编文件名(无空格),不能将目标汇编文件当作源文件传入
正确命令示例
1. 生成默认名称的汇编文件(code.asm)
cl /Tc code.i /Fa
2. 指定自定义汇编文件名(比如output.asm)
cl /Tc code.i /Faoutput.asm
注意:/Fa和文件名之间不能有空格,否则cl会误将文件名当作源文件处理,这也是第一个命令报错的关键原因。
3. 仅编译不链接(避免生成可执行文件)
如果只需要汇编文件,不需要链接生成exe,可添加/c参数跳过链接步骤:
cl /c /Tc code.i /Fa
参数说明
/Tc:强制将后续文件当作C源文件处理,解决.i文件不被识别的问题/Fa:生成汇编文件,若紧跟文件名则指定输出名称,否则使用源文件名+.asm/c:仅执行编译步骤,不进行链接,避免不必要的链接错误
内容的提问来源于stack exchange,提问作者Soup Creamy Chicken

