与C语言的接口组件
我试图从一个使用MingWGCC编译的简单C驱动程序类中调用一个使用NASM组装的汇编函数 我正在使用以下命令编译和组装文件与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:(.
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();
}