2016-11-18 48 views
1

用于学习目的,我写了一个小汇编程序(TEST.ASM):MinGW的32 “未定义参考`了ExitProcess @ 4' ”

global _main 

extern [email protected] 

section .text 

    _main: 

     mov  ebx,0 
     push ebx 
     call [email protected] 

比我与NASM组装它(test.obj):

nasm -f win32 test.asm 

现在我想将它链接到 “移植可执行”(的Windows 10 32位的):

ld test.obj 

但我总是收到此错误信息:

undefined reference to `[email protected]' 

据我理解这条消息意味着,我的程序不挂“的Kernel32.dll”。 但我认为“ld”自动链接“Kernel32.dll”,所以我不必为此添加一些标志。 而且如果我添加此标志:

ld test.obj -lkernel32 

我收到以下错误消息:

cannot find -lkernel32 

我相信我做了一个愚蠢的错误,所以也许有人能告诉我什么是错的。

编辑:

如果我使用 “GCC”,而不是它的工作的:

gcc main.obj -nostdlib -lkernel32 

所以现在我想知道为什么 “GCC” 知道 “-lkernel32”和“ld”。

+1

将'-v'选项添加到'gcc'命令行,您将看到它是如何为您调用'ld'的。 – Jester

+0

谢谢。这是我很好的暗示。 – Michael

+0

kernel32.lib在哪里?您是否尝试添加'-L '操作数? – fuz

回答

1

正如你已经想通了,ld你需要指定路径来找到正确的库。

一个忠告不过,如果你想使你的生活学习过程更容易,存在这所谓的golink轻量级链接程序在连接这些类型的片段是因为这样做很容易:

> nasm -f win32 foo.asm && golink foo.obj kernel32.dll 

GoLink.Exe Version 1.0.2.3 - Copyright Jeremy Gordon 2002-2016 - [email protected] 
Output file: foo.exe 
Format: Win32 Size: 1,536 bytes 

它可以让你链接到必要的dll,这很不错,不需要一直搞乱搜索路径。