2016-11-18 17 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,這很不錯,不需要一直搞亂搜索路徑。