Macos 如何解决在尝试链接C++;装配? 我试图链接一个C++文件和一个汇编文件。程序集文件定义了一个C++函数,名为“代码> ADD/COMPUT>。我使用的是64位Mac操作系统。我试图编译程序时出现以下错误: Undefined symbols for architecture x86_64: "_add", referenced from: _main in main-d71cab.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [main.o] Error 1

Macos 如何解决在尝试链接C++;装配? 我试图链接一个C++文件和一个汇编文件。程序集文件定义了一个C++函数,名为“代码> ADD/COMPUT>。我使用的是64位Mac操作系统。我试图编译程序时出现以下错误: Undefined symbols for architecture x86_64: "_add", referenced from: _main in main-d71cab.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [main.o] Error 1,macos,assembly,linker,g++,64-bit,Macos,Assembly,Linker,G++,64 Bit,生成文件 你好,asm main.cpp #包括 外部“C”内部添加(内部a、内部b); int main(int argc,char*argv[]){ INTA,b; std::cout>a; 标准:cin>>b; std::cout在OS/X上,C调用约定是,当从对象导出时,函数必须在其上有下划线(除非被重写),才能对C可见。在这个原型上放置extern“C”时,您是说add正在使用C调用约定: extern "C" int add(int a, int b); 这实际上是正确的,但为了使

生成文件

你好,asm

main.cpp

#包括
外部“C”内部添加(内部a、内部b);
int main(int argc,char*argv[]){
INTA,b;
std::cout>a;
标准:cin>>b;
std::cout在OS/X上,C调用约定是,当从对象导出时,函数必须在其上有下划线(除非被重写),才能对C可见。在这个原型上放置
extern“C”
时,您是说add正在使用C调用约定:

extern "C" int add(int a, int b);
这实际上是正确的,但为了使您的汇编代码符合要求,您还需要确保您的汇编函数是全局的,并且对C/C++代码是可见的,它们上面有一个前导下划线。您的汇编代码的开头如下所示:

global _add

segment .text
_add:

另一个问题是
Makefile
和从
main.cpp
生成
main.o
的方式

main.o: main.cpp
  g++ main.cpp -o main.o 
这告诉
g++
main.cpp
编译成一个名为
main.o
可执行文件。您真正想做的是告诉
g++
跳过链接到一个可执行部分,并且输出文件
main.o
实际上将是一个对象。为此,将行更改为:

main.o: main.cpp
   g++ -c main.cpp -o main.o
-c
选项表示跳过链接阶段(该阶段生成一个可执行文件并简单地输出一个稍后将链接的对象)


当它试图创建
main.o
时,如果没有此更改,它会认为您需要一个可执行文件,并且找不到函数
\u add
,因为它不在它知道的文件中。它在
hello.o
中,但是命令
g++main.cpp-o main.o
不知道。

@MichaelPetch谢谢,修复了它。
global _add

segment .text
_add:
main.o: main.cpp
  g++ main.cpp -o main.o 
main.o: main.cpp
   g++ -c main.cpp -o main.o