MASM32 - 链接时带有下划线的“未解析的外部符号”

时间:2013-03-26 02:08:58

标签: windows assembly masm32

我从以下网站下载并提取了MASM32 + SDK:http://www.masm32.com/masmdl.htm

然后我使用ml.exe和link.exe编译并链接了以下程序:

.386
.model flat, stdcall

; Windows libraries
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
extrn MessageBoxA@16 : PROC
extrn ExitProcess@4 : PROC

option casemap:none ; Treat labels as case-sensitive

.DATA           ; Begin initialized data segment
  ProgramTitle db "Hello, puny humans!", 0 ; define byte
  DisplayText db "Wahahaha", 0

.CODE           ; Begin code segment
_main PROC

  push 0
  mov eax, offset ProgramTitle
  push eax
  push offset DisplayText
  push 0

  call MessageBoxA@16
  call ExitProcess@4

  ret
_main ENDP

END 

命令行:

ml /c test.asm
link /entry:_main /subsystem:windows test.obj

输出:

ml /c test.asm
    Assembling:  test.asm

link /entry:_main /subsystem:windows test.obj    
    test.obj : warning LNK4033: converting object format from OMF to COFF
    test.obj : error LNK2001: unresolved external symbol _MessageBoxA@16
    test.obj : error LNK2001: unresolved external symbol _ExitProcess@4
    test.exe : fatal error LNK1120: 2 unresolved externals

尝试在.obj文件上运行dumpbin:

Dump of file test.obj
test.obj : warning LNK4048: Invalid format file; ignored

    Summary

我觉得我无法使用MASM32(ml.exe v.6.14)的默认功能和开箱即用的库来链接文件。

2 个答案:

答案 0 :(得分:2)

必须使用/ coff选项编译程序。 ml 6.14默认为OMF。这是dumpbin拒绝文件(它只接受COFF)和链接器警告“将对象格式从OMF转换为COFF”的原因:

ml /c /coff test.asm

dumpbin输出反映了这个:

File Type: COFF OBJECT

    Summary

        1D .data
        48 .drectve
        1A .text

除了test.exe和Microsoft的版权声明之外,链接器没有输出。

注意:

ML.EXE 6.14大约有20年的历史。 (Wikipedia

版本7.0+与Visual C ++开发环境捆绑在一起。版本8.0+受到某些限制:(masm32.com

  

“版本7.0及更高版本是Microsoft Visual C ++的组件   开发环境也已经提供了许多   用于Microsoft的后续版本的设备开发工具包   视窗。 8.0及更高版本已经免费下载   来自Microsoft的EULA,限制免费版本的使用   为Microsoft操作系统开发代码。“

MASM 8.0可在此处获取: http://www.microsoft.com/en-us/download/details.aspx?id=12654

答案 1 :(得分:1)

EXTRA NOTE 6.14,

在这种情况下,

ml.exe将忽略/ coff选项(奇怪的问题。)

ml test.asm /c /coff

ml.exe会考虑/ coff选项。

ml /c /coff test.asm