【问题标题】:Error while linking asm code链接 asm 代码时出错
【发布时间】:2016-07-19 16:10:11
【问题描述】:

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

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

【问题讨论】:

标签: windows assembly masm masm32


【解决方案1】:

您要查找的命令是:

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:\...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 位构建环境。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我现在正在安装它,但是什么是 windows SDK 以及为什么要使用它? (仅供参考)
    • 我通过这个链接 (microsoft.com/en-in/download/details.aspx?id=8279) 在 Windows 7 中安装了它。它没有用。我必须设置任何环境路径吗?还是别的什么?
    • Kernel.Lib 和 User32.Lib 存在于 C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib
    • 在 Visual Studio 中,进入解决方案资源管理器,右键单击您的项目,进入属性,配置属性 -> 常规 - 平台工具集,更改为 Windows7.1SDK
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2012-08-13
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多