Windows 链接asm代码时出错

Windows 链接asm代码时出错,windows,assembly,masm,masm32,Windows,Assembly,Masm,Masm32,我用汇编语言编写了一个简单的程序,它将在Windows7 32位中简单地显示一个消息框 .386 .model flat, stdcall option casemap :none extrn MessageBoxA@16 : PROC extrn ExitProcess@4 : PROC .data HelloWorld db "Welcome to SecurityTube.net!", 0 MsgTitle db "First MessageBox", 0 .code

我用汇编语言编写了一个简单的程序,它将在Windows7 32位中简单地显示一个消息框

.386
.model flat, stdcall
option casemap :none

extrn MessageBoxA@16 : PROC
extrn ExitProcess@4 : PROC

.data
    HelloWorld db "Welcome to SecurityTube.net!", 0
    MsgTitle db "First MessageBox", 0

.code
start:
    mov eax, 0
    push eax
    lea ebx, MsgTitle
    push ebx
    lea ebx, HelloWorld
    push ebx
    push eax
    call MessageBoxA@16
    push eax
    call ExitProcess@4
end start
我使用以下命令进行组装和链接

ml /c /coff helloworld.asm
link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib helloworld.obj 
程序组装得很好。但是,在链接时,我遇到了以下错误:

Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK : fatal error LNK1104: cannot open file "kernel32.lib"

为什么会出现此错误以及如何减轻此错误?

是否检查了Visual Studio的目录结构并查找$WindowsSdkDir\lib以查看它们是否存在?
如果未安装,是否检查Visual Studio的目录结构并查找$WindowsSdkDir\lib以查看它们是否存在?
如果未安装

您要查找的命令是:

ml.exe helloworld.asm
    /coff
    /link
        /subsystem:windows
        /defaultlib:kernel32.lib
        /defaultlib:user32.lib
        /libpath:C:\...somewhere...
        helloworld.obj
请注意,我没有首先使用/c开关运行ml,该开关只在没有链接的情况下进行组装,然后再运行link,而是将其组合到一个命令行中。这将运行MASM来组装代码,然后立即链接它

神奇的调料是/link开关,它将其后的每个参数传递给链接器

请注意您没有的另一个新开关:/libpath。这是一个告诉链接器在哪里可以找到LIB文件的链接器。它们是Windows SDK的一部分,因此您需要在硬盘上找到该目录,并将该路径替换为C:\…某处。。。。具体位置会有所不同,具体取决于您安装的SDK版本以及单独安装的方式,或者作为Visual Studio的一部分安装的方式。如果您没有SDK,请下载它,或者。请注意,最新版本已足够;您不需要下载每个版本。它支持多目标定位

MASM的文档是全部,包括一个完整的列表。链接器也是如此;是的

一个更简单的解决方案是打开VisualStudio命令提示符并从那里执行所有组装和链接。这实际上运行一个批处理文件,为您设置环境,这样您就不必担心指定所有必需SDK文件头、库等的路径。。您可以在“开始”菜单中找到,或手动运行:

C:\Program Files (x86)\Microsoft Visual Studio x.x\VC\bin\vcvars32.bat

设置32位生成环境。

要查找的命令是:

ml.exe helloworld.asm
    /coff
    /link
        /subsystem:windows
        /defaultlib:kernel32.lib
        /defaultlib:user32.lib
        /libpath:C:\...somewhere...
        helloworld.obj
请注意,我没有首先使用/c开关运行ml,该开关只在没有链接的情况下进行组装,然后再运行link,而是将其组合到一个命令行中。这将运行MASM来组装代码,然后立即链接它

神奇的调料是/link开关,它将其后的每个参数传递给链接器

请注意您没有的另一个新开关:/libpath。这是一个告诉链接器在哪里可以找到LIB文件的链接器。它们是Windows SDK的一部分,因此您需要在硬盘上找到该目录,并将该路径替换为C:\…某处。。。。具体位置会有所不同,具体取决于您安装的SDK版本以及单独安装的方式,或者作为Visual Studio的一部分安装的方式。如果您没有SDK,请下载它,或者。请注意,最新版本已足够;您不需要下载每个版本。它支持多目标定位

MASM的文档是全部,包括一个完整的列表。链接器也是如此;是的

一个更简单的解决方案是打开VisualStudio命令提示符并从那里执行所有组装和链接。这实际上运行一个批处理文件,为您设置环境,这样您就不必担心指定所有必需SDK文件头、库等的路径。。您可以在“开始”菜单中找到,或手动运行:

C:\Program Files (x86)\Microsoft Visual Studio x.x\VC\bin\vcvars32.bat

设置32位生成环境。

您需要指定库路径。是一个很好的起点。您需要指定库路径。是一个很好的起点。我正在安装它,但什么是windows SDK,为什么要使用它?只是为了获取知识,我通过此链接在windows 7中安装了它。它不起作用。我必须设定任何环境路径吗?或者其他任何东西?Kernel.Lib和User32.Lib在C:\Program Files\Microsoft SDK\Windows\v7.1\Lib Visual Studio中,转到解决方案资源管理器,右键单击项目,转到属性,配置属性->常规-平台工具集,更改为Windows7.1SDK我正在安装它,但什么是Windows SDK,为什么要使用它?只是为了获取知识,我通过此链接在windows 7中安装了它。它不起作用。我必须设定任何环境路径吗?或者其他内容?Kernel.Lib和User32.Lib在C:\Program Files\Microsoft SDK\Windows\v7.1\Lib中,在Visual Studio中,转到解决方案资源管理器,右键单击项目,转到属性,配置属性->常规-平台工具集,更改为Windows7.1SDK