VS2019编译ASM项目报LNK1104无法打开Main.obj错误求助
VS2019编译.asm项目LNK1104报错问题
问题描述
在配置Visual Studio 2019编译.asm项目时遇到报错,创建空C++项目并添加Main.asm文件,尝试使用MASM和NASM编译均出现相同错误:
LNK1104 cannot open file 'C:\Users\Serge Fonville\source\repos\NASM\x64\Debug\Main.obj'
对应路径下不存在目标.obj文件,但手动编译可正常运行,已确认汇编器生成扩展已启用、.asm文件设置了对应项类型,重装组件和参照公开配置教程均无法解决问题。
参考代码
NASM代码
; ---------------------------------------------------------------------------------------- ; This is a Win64 console program that writes "Hello" on one line and then exits. It ; uses puts from the C library. To assemble and run: ; ; nasm -fwin64 hello.asm && gcc hello.obj && a ; ---------------------------------------------------------------------------------------- global main extern puts section .text main: sub rsp, 28h ; Reserve the shadow space mov rcx, message ; First argument is address of message call puts ; puts(message) add rsp, 28h ; Remove shadow space ret message: db 'Hello', 0 ; C strings need a zero byte at the end
MASM代码
;Descr : My First 64-bit MASM program ;ml64 prog.asm /c ;golink /console /entry main prog.obj msvcrt.dll, or ;gcc -m64 prog.obj -o prog.exe (main/ret). This needs 64-bit GCC. ;----------------------------------- extrn printf:proc extrn exit:proc .data hello db 'Hello 64-bit world!',0ah,0 .code main proc mov rcx,offset hello sub rsp,20h call printf add rsp,20h mov rcx,0 call exit main endp end
编译输出
Rebuild started... 1>------ Rebuild All started: Project: NASM, Configuration: Debug x64 ------ 1>LINK : fatal error LNK1104: cannot open file 'x64\Debug\Main.obj' 1>Done building project "NASM.vcxproj" -- FAILED. ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
文件检索结果
执行dir /s /b c:\main.obj结果如下:
c:\VTRoot\HarddiskVolume3\Users\Serge Fonville\source\repos\NASM\NASM\x64\Debug\Main.obj
解决方案
核心根因定位
- 输出路径不匹配:VS链接器预期读取的路径比汇编器实际生成的路径少了一层
NASM子目录,导致链接时找不到目标文件 - 安全软件沙箱重定向:路径前缀的
VTRoot\HarddiskVolume3是安全软件(多为Symantec、企业版杀毒软件)的沙箱隔离机制,汇编器输出的文件被重定向到虚拟隔离目录,VS链接器无权限读取该路径下的文件
修复步骤
- 修正项目输出配置
右键项目打开「属性」面板,切换到当前使用的Debug x64配置:- 进入「常规」选项卡,确认「输出目录」设置为
$(SolutionDir)$(Platform)\$(Configuration)\,「中间目录」设置为$(Platform)\$(Configuration)\ - 右键
Main.asm文件打开属性,确认「项类型」和所用汇编器对应:MASM选Microsoft Macro Assembler,NASM选对应扩展注册的项类型 - 进入汇编器的「输出文件」设置页,将目标文件名配置为
$(IntDir)%(FileName).obj,强制obj文件输出到VS预期的中间目录
- 进入「常规」选项卡,确认「输出目录」设置为
- 排除安全软件干扰
临时关闭安全软件的实时防护/沙箱功能,或者将整个项目目录加入安全软件白名单,避免生成的文件被重定向到虚拟隔离路径 - 规避特殊路径字符
可尝试将项目迁移到不带空格、中文的路径下(例如C:\Repos\ASMTest),排除部分旧版汇编器处理特殊路径的兼容性问题
内容的提问来源于stack exchange,提问作者Serge Fonville
相关产品推荐
相关产品推荐

