在Mac OSX上将程序集(x86-64)中的printf和scanf与C文件链接时出现问题

在Mac OSX上将程序集(x86-64)中的printf和scanf与C文件链接时出现问题,c,macos,assembly,printf,nasm,C,Macos,Assembly,Printf,Nasm,我在汇编(x86-64)中编写了一个程序,并从C文件包装器中调用它以使用printf和scanf函数。但是,当我尝试链接它时,会出现以下错误: $ nasm -f macho64 -l Parallelograms.lis -o assembly.o Parallelograms.asm $ gcc -c -Wall -m64 -o main.o ParallelogramDriver.c $ gcc -m64 -o main.out main.o assembly.o Undefined sy

我在汇编(x86-64)中编写了一个程序,并从C文件包装器中调用它以使用printf和scanf函数。但是,当我尝试链接它时,会出现以下错误:

$ nasm -f macho64 -l Parallelograms.lis -o assembly.o Parallelograms.asm
$ gcc -c -Wall -m64 -o main.o ParallelogramDriver.c
$ gcc -m64 -o main.out main.o assembly.o
Undefined symbols for architecture x86_64:
  "_calcAndPrint", referenced from:
      _main in main.o
  "printf", referenced from:
      calcAndPrint in assembly.o
  "scanf", referenced from:
      calcAndPrint in assembly.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
我相信这与macho64国旗有关。如果我使用elf64,它就不会捕获printf或scanf错误。然而,elf64在Mac上是一种不兼容的文件格式(据我所知)

这是我的C文件(ParallelogramDriver.C):


为混乱的代码道歉。这是我的第一个汇编代码程序,我对它很陌生。我正在开发MacOSX,据我所知,这是MacOSX特有的问题。感谢您的帮助。

在OS X上,符号的前缀是下划线

call        printf

需要

call        _printf

分别;也

global calcAndPrint

应该读

global _calcAndPrint

相反


(但是,嘿,你可以从你的
calcAndPrint()
函数被符号化为
\u calcAndPrint
)这一事实推断出这一点。

你是否编写了汇编程序或CTRL+C CTRL+V'd:-PI编写了它,大量引用了我们老师提供的示例代码。我复制并粘贴在这里。这是我的第一个汇编程序,很抱歉代码看起来很粗糙。有些行为可以用
-fleading下划线来控制。但在本例中,仅适用于
calcAndPrint
。操作系统提供的符号将保留一个前导的
\u
。将
--前缀添加到Nasm的命令行应该可以解决这个问题(作为在.asm源代码中添加下划线的替代方法。此外,除非它是x64的新版本,否则C不知道
tword
——试着用
qword
替换它……谢谢,修复了它!而且--prefix也起了作用。非常感谢。这让我的计算机科学老师感到难堪,我还在为汇编绞尽脑汁。)。
call        _printf
call        _scanf
global calcAndPrint
calcAndPrint:
global _calcAndPrint
_calcAndPrint: