2016-11-18 37 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 

Теперь я пытаюсь связать его с "Portable Executable" (для Windows 10 32 Bit):

ld test.obj 

Но я всегда получаю сообщение об ошибке:

undefined reference to `[email protected]' 

Насколько я понимаю, это сообщение, это означает, что моя программа не связана с «Kernel32.dll». Но я думал: «ld» ссылается на «Kernel32.dll» автоматически, поэтому мне не нужно добавлять к нему несколько флагов. Кроме того, если добавить этот флаг:

ld test.obj -lkernel32 

Я получаю следующее сообщение об ошибке:

cannot find -lkernel32 

Я уверен, что я глупая ошибка, так, может быть, кто-то может сказать мне, что случилось.

EDIT:

Если я использую "НКУ" вместо этого произведения:

gcc main.obj -nostdlib -lkernel32 

Так что теперь я задаюсь вопросом, почему "НКУ" знает "-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, и это в значительной степени, не нужно постоянно путаться с поисковыми путями.