我有一个关于如何在Terminal Mac中编译C ++程序的问题。我的程序有一个头文件和一个主文件。我知道我无法编译头文件和主文件。并只是编译主文件。我也知道我需要创建一个名称来存储编译文件。这是我使用g++ -o execute1 main.cpp
的编译命令,我得到了这个:
Undefined symbols for architecture x86_64:
"add(int, int)", referenced from:
_main in main-f2nZvj.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我该如何解决这个问题?任何帮助将不胜感激。如果有帮助,下面是我的两个文件的代码:
add.h:
int add(int x, int y);
main.cpp中:
#include <iostream>
#include "add.h"
int main(){
using namespace std;
cout << "The sum of 9 and 9 is " << add(9, 9) << endl;
return 0;
}
答案 0 :(得分:5)
您需要一个add.cpp
文件来实现您的add()
函数,然后您可以将整个文件编译为:
$ g++ -Wall main.cpp add.cpp -o execute1
答案 1 :(得分:0)
这一行:
int add(int x, int y);
你的add.h
中的只是告诉编译器某处,有一个名为add
的函数,它接受两个整数并返回一个整数。在add
的文件中使用此#include "add.h"
函数时,单独使用此功能将使编译器不再孤立。编译器不必确切知道函数的作用,只需要知道它接受的参数和函数返回的内容。在实际编译函数之前,它不会费心寻找函数体。
为了正确编译,您需要在add
中包含add.cpp
函数的函数体。即使只是这样也可以:
int add(int x, int y) {
return 1;
}
这将允许程序编译,因为现在编译器知道它在add
内调用main
函数时应该执行的代码。
这将至少作为占位符,直到您准备好实际编写您希望此函数包含的确切逻辑。但是在此函数体存在之前,您将无法编译(除非您删除对该函数的所有其他引用)。