如何通过终端Mac编译C ++程序

时间:2013-12-02 18:40:42

标签: c++ macos compilation terminal header-files

我有一个关于如何在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;
}

2 个答案:

答案 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函数时应该执行的代码。

这将至少作为占位符,直到您准备好实际编写您希望此函数包含的确切逻辑。但是在此函数体存在之前,您将无法编译(除非您删除对该函数的所有其他引用)。