使用 g++ 编译 - 包括头文件

Posted

技术标签:

【中文标题】使用 g++ 编译 - 包括头文件【英文标题】:Compiling with g++ - including header files 【发布时间】:2014-08-06 12:59:36 【问题描述】:

我只是有一个简单的问题,因为我试图了解如何在 C++ 中编译(在 ubuntu 12.04 中)包含一个简单头文件的 main。

命令:

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

工作正常。但是,这让我对头文件的意义感到困惑。目前,我有一个简单的程序:

#include <iostream>
#include "add.h"
using namespace std;

int main () 


  int a, b;
  cout << "Enter two numbers to add together" << endl;
  cin >> a >> b;
  cout << "Sum of " << a << " and " << b << " is " << add(a,b) << endl;

  return 0;


我的“add.cpp”只是将两个数字相加。

头文件只是函数原型的替代品吗?我需要单独编译头文件还是在命令行中包含所有 .cpp 文件就足够了?我知道如果我需要更多文件,则需要生成文件。

【问题讨论】:

Why have header files and .cpp files in C++?的可能重复 【参考方案1】:

#include 预处理器代码只是将#include 行替换为相应文件的内容,即代码中的add.h。使用g++参数-E预处理后可以看到代码。

理论上你可以在头文件中放任何东西,该文件的内容将通过#include语句进行复制,无需单独编译头文件。

可以将所有cpp文件放在一个命令中,也可以单独编译,最后链接:

g++ -c source1.cpp -o source1.o
g++ -c source2.cpp -o source2.o
g++ -c source3.cpp -o source3.o
g++ source1.o source2.o source3.o -o source

编辑

您也可以直接在 cpp 文件中编写函数原型,例如(没有头文件):

/* add.cpp */
int add(int x, int y) 
    return x + y;

/* main.cpp */
#include <iostream>
using namespace std;

int add(int x, int y);    // write function protype DIRECTLY!
// prototype tells a compiler that we have a function called add that takes two int as
// parameters, but implemented somewhere else.

int main() 
    int a, b;
    cout << "Enter two numbers to add together" << endl;
    cin >> a >> b;
    cout << "Sum of " << a << " and " << b << " is " << add(a,b) << endl;
    return 0;

它也有效。但是最好使用头文件,因为原型可以在多个 cpp 文件中使用,而无需在更改原型时更改每个 cpp 文件。

【讨论】:

不需要-o sourceX.o,除非您想更改目标文件的名称。 好的,但是我的困惑在于头文件的使用...运行hte代码时,您仍然必须单独编译每个.cpp文件,对吗?不考虑头文件?还是在命令行中包含头文件?抱歉,这是我一直无法理解的领域!【参考方案2】:

当使用头文件(例如header.h)时,仅当它存在时才包含它 在上述目录中:

~$ g++ source1.cpp source2.cpp source3.cpp -o main -Wall

【讨论】:

我想你的意思是“如果它不存在于所描述的目录中”?

以上是关于使用 g++ 编译 - 包括头文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

gcc 查看 引用头文件的位置

如何在Linux上使用相关的头文件编译这个C ++代码?

Linux g++ 下的 MFC 头文件:在“<”标记之前需要“”

与头文件一起使用时,使用个人 C++ 库编译代码会中断

编译生成的h.gch文件是什么鬼?