与C语言的接口组件

与C语言的接口组件,c,gcc,assembly,nasm,C,Gcc,Assembly,Nasm,我试图从一个使用MingWGCC编译的简单C驱动程序类中调用一个使用NASM组装的汇编函数 我正在使用以下命令编译和组装文件 nasm -f win32 asm_main.asm -o asm.o gcc -c driver.c -o driver.o 和以下命令将它们链接在一起 ld.exe asm.o driver.o -L"C:\Windows\SysWOW64" -lkernel32 -luser32 -o app.exe 我收到错误消息: driver.o:driver.c:(.

我试图从一个使用MingWGCC编译的简单C驱动程序类中调用一个使用NASM组装的汇编函数

我正在使用以下命令编译和组装文件

nasm -f win32 asm_main.asm -o asm.o

gcc -c driver.c -o driver.o
和以下命令将它们链接在一起

ld.exe asm.o driver.o -L"C:\Windows\SysWOW64" -lkernel32 -luser32 -o app.exe
我收到错误消息:

driver.o:driver.c:(.text+0x7): undefined reference to `__main'
这是我的示例程序集和C代码

; asm.asm
extern _MessageBoxA, _ExitProcess

section .data
    title db "Greeting", 0
    message db "Hello World!", 0
section .bss

section .text
    global _asm_main

_asm_main:
    enter 0, 0

    push dword 0 
    push dword title
    push dword message 
    push dword 0 
    call _MessageBoxA

    push dword 0 
    call _ExitProcess

    mov eax, 0 
    leave
    ret

你知道我为什么会犯这个错误吗? 谢谢

更新:
我把出口程序改成了_ExitProcess@4和MessageBox到_MessageBoxA@16并与gcc链接。

您缺少gcc C启动例程
\uu main
(使用gcc编译时由
main
调用),该例程通常在libgcc中定义。获取它的最简单方法是与gcc(包括它)链接,而不是与ld链接。或者,将
-lgcc
添加到link命令行。

我尝试了gcc,但得到了一组不同的错误:c:/mingw/bin/./lib/gcc/mingw32/4.9.3/../../../../../../libmingw32.a(tlsthrd.o):(.text+0x218):未定义的
InitializeCriticalSection@4'c:/mingw/bin/./lib/gcc/mingw32/4.9.3/../../../../../libmingwex.a(杂项o):(.text+0x67):未定义的引用
InitializeCriticalSection@4“@Ian,然后你需要添加到win32或其他东西的链接。尝试添加
-lwin32
。如果这不起作用,至少是一个暗示!您缺少一些基本的windows库。
// driver.c
extern int asm_main();


void main()
{   
    asm_main(); 
}