我在汇编文件math.nasm中编写了一个函数nabs 如下
%ifdef USE_x86_ASM
SECTION .text
cglobal nABS
;*------------------------*
;* int nABS(int a) *
;* return value in eax *
;*------------------------*
ALIGN 16
nABS:
push ebx
......
......
pop ebx
ret
%endif
我从文件myfunc.c中的c函数func1调用此函数 我正在使用nasm汇编程序用于汇编文件我正在使用X-code 3.1版本和gcc 4.0编译器我已经定义了USE_x86_ASM
在Xcode设置项目设置/构建/ NASM构建选项/其他标记中--DUSE_X86_ASM
我也在头文件myfunc.h中定义了这个预处理器
我在myfunc.h中将nABS声明为
#define USE_x86_ASM
int nABS(int a);
并将myfunc.h包含在myfunc.c中 myfunc.c和math.nasm都是sussessfuly编译并生成math.o和myfunc.o,但是我收到链接错误
Undefined symbols:
"_nABS", referenced from:
_func1 in myFunc.o
任何人都可以告诉我为什么会收到链接错误?
我做了修改建议另外我删除%ifdef条件修改后的代码如下
.text
.align 2
.globl _nABS
.private_extern _nABS
_nABS:
推ebx
......
......
pop ebx
RET
我仍然得到相同的链接错误文件编译但我得到相同的链接错误。
我检查了生成的.o是否包含app.LinkFileList。
答案 0 :(得分:1)
某些C编译器在C符号中添加了前面的下划线。只需将下划线添加到汇编文件中的标签(当然还有globl
指令)。
答案 1 :(得分:1)
%ifdef USE_x86_ASM
SECTION .text
;*------------------------*
;* int nABS(int a) *
;* return value in eax *
;*------------------------*
ALIGN 16
global _nABS
nABS:
push ebx
......
......
pop ebx
ret
%endif