链接asm代码时出错

时间:2016-07-19 16:10:12

标签: windows assembly masm masm32

我用汇编语言编写了一个简单的程序,只需在Windows 7 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"

为什么我收到此错误以及如何缓解错误?

2 个答案:

答案 0 :(得分:3)

您正在寻找的命令是:

ml.exe helloworld.asm
    /coff
    /link
        /subsystem:windows
        /defaultlib:kernel32.lib
        /defaultlib:user32.lib
        /libpath:C:\...somewhere...
        helloworld.obj

请注意,我不是首先使用ml开关运行/c(仅在没有链接的情况下进行汇编),然后运行link,而是将其全部合并到一个单命令行。这将运行MASM来汇编代码,然后立即链接它。

魔术酱是/link开关,它将之后的传递给链接器。

请注意您没有的其他新开关:/libpath。这是告诉链接器可以找到LIB文件的位置。它们是Windows SDK的一部分,因此您需要在硬盘上找到该目录,并将该路径替换为C:\...somewhere...。具体位置根据您安装的SDK的版本以及安装方式(单独或作为Visual Studio的一部分)而有所不同。如果您没有SDK,请下载here for Windows 10for earlier versions。 (请注意,最新版本已足够;您无需下载每个版本。它支持多目标。)

MASM的文档全部为available online,包括command line options的完整列表。链接器也是一样的;它的options are here

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

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

设置32位构建环境。

答案 1 :(得分:1)

您是否检查过Visual Studio的目录结构并查找$(WindowsSdkDir)\lib以查看它们是否存在?
如果没有安装http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx