2016-11-18 4 views
1

TEST.ASM):私はNASMでそれを組み立てたよりMinGWの32 "`への未定義参照のExitProcess 4' @" 私は小さなアセンブラプログラムを書いた学習の目的のために

global _main 

extern [email protected] 

section .text 

    _main: 

     mov  ebx,0 
     push ebx 
     call [email protected] 

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 

を私はので、多分誰かが間違っているものを私に伝えることができダム間違いをしたと確信しています。

EDIT:だから今、私はなぜ "gccの" "-lkernel32" 知っているが疑問に思って

gcc main.obj -nostdlib -lkernel32 

私は "gccの" の代わりに、それはの仕事を使用していた場合「ld」は含まれていません。

+1

'-v'オプションを' gcc'コマンドラインに追加すると、 'ld'をどのように呼び出すのかがわかります。 – Jester

+0

ありがとうございます。それは私の大きなヒントです。 – Michael

+0

kernel32.libはどこですか? '-L 'オペランドを追加しようとしましたか? – fuz

答えて

1

すでに理解したように、ldで適切なライブラリを見つけるためにパスを指定する必要があります。

> 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 

は、それはあなたのことができます:あなたが学習プロセス上のあなたの人生を容易にしたい場合は

一つのアドバイスは、しかし、スニペットのこれらのタイプをリンクすることと同じくらい簡単ですgolinkと呼ばれるこの軽量リンカが存在します必要なDLLにリンクするには、それはほとんどの場合、検索パスをいつも混乱させる必要はありません。

関連する問題