【问题标题】:error LNK2001: unresolved external symbol _MessageBox错误 LNK2001:无法解析的外部符号 _MessageBox
【发布时间】:2011-05-06 14:22:54
【问题描述】:

我正在尝试仅使用 masm 而不是 masm32 库创建一个 helloworld 程序。这是代码sn-p:

.386
.model flat, stdcall
option casemap :none

extrn MessageBox : PROC
extrn ExitProcess : PROC

.data
        HelloWorld db "Hello There!", 0

.code
start:

        lea eax, HelloWorld
        mov ebx, 0
        push ebx
        push eax
        push eax
        push ebx
        call MessageBox
        push ebx
        call ExitProcess

end start

我可以使用 masm 组装它:

c:\masm32\code>ml /c /coff demo.asm
Microsoft (R) Macro Assembler Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: demo.asm

但是,我无法链接它:

c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user
32.lib demo.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

demo.obj : error LNK2001: unresolved external symbol _MessageBox
demo.obj : error LNK2001: unresolved external symbol _ExitProcess
demo.exe : fatal error LNK1120: 2 unresolved externals

我在链接过程中包含了库,所以不知道为什么它仍然显示未解析的符号?

更新:

c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user
32.lib demo.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

demo.obj : error LNK2001: unresolved external symbol _MessageBox@16
demo.exe : fatal error LNK1120: 1 unresolved externals

更新 2:最终工作代码!

.386
.model flat, stdcall
option casemap :none

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

.data
        HelloWorld db "Hello There!", 0

.code
start:

        lea eax, HelloWorld
        mov ebx, 0
        push ebx
        push eax
        push eax
        push ebx
        call MessageBoxA@16
        push ebx
        call ExitProcess@4

end start

【问题讨论】:

    标签: winapi assembly masm masm32


    【解决方案1】:

    正确的函数名称是MessageBoxA@16ExitProcess@4

    几乎所有的 Win32 API 函数都是 stdcall,所以 their names are decorated 带有 @ 符号,后跟其参数占用的字节数。

    此外,当 Win32 函数采用字符串时,有两种变体:一种采用 ANSI 字符串(名称以 A 结尾),另一种采用 Unicode 字符串(名称以 W 结尾)。您提供的是 ANSI 字符串,因此您需要 A 版本。

    当您不使用汇编编程时,编译器会为您处理这些问题。

    【讨论】:

    • 谢谢!这解决了一个链接错误,但没有解决另一个.. 请参阅更新
    • 太棒了!现在工作得很好。我觉得自己很n00b - 你能推荐任何我可以从中挑选所有这些东西的文档/书籍吗?当您是新手时,MSDN 太令人生畏了。
    • 您可能还想参考 Iczelion 的 Win32 ASM 教程:win32assembly.online.fr
    • 我喜欢 Randall Hyde 的作品:homepage.mac.com/randyhyde/webster.cs.ucr.edu/Win32Asm/…。他使用 HLA,它实际上是原始 MASM 之上的一组宏,但原理是相同的。
    • 顺便说一句,这些不是小问题:使用汇编,您必须处理高级工具通常处理的许多烦人的细节。
    【解决方案2】:

    尝试在.data 段之前添加这个:

    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 2013-09-11
      • 2022-01-07
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      相关资源
      最近更新 更多