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

How to compile a C++ program via Terminal Mac

本文关键字:C++ 程序 编译 Mac 何通过 终端      更新时间:2023-10-16

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

您需要一个实现add()函数的add.cpp文件,然后您可以将整个文件编译为:

$ g++ -Wall main.cpp add.cpp -o execute1

此行:

int add(int x, int y);

add.h中,只需告诉编译器某个地方有一个名为add的函数,它接受两个整数并返回一个整数。当您在#include "add.h"的文件中使用此add函数时,单独使用this和this将使编译器不必理会您。编译器不必确切地知道函数的作用,只需要知道它接受什么参数以及函数返回什么。直到它真正开始编译函数,它才开始查找函数体。

为了使其正确编译,您需要在add.cpp中包含add函数的函数体。即使只是这样也能奏效:

int add(int x, int y) {
    return 1;
}

这将允许程序进行编译,因为现在编译器知道在调用main中的add函数时应该执行什么代码。

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