在主程序中包含头文件和源文件之间的混淆

时间:2012-06-16 10:17:21

标签: c++ header

我听说我们应该在头文件和源文件中的定义中编写声明,源和头都具有相同的名称。然后只在源代码中包含标题。

以下是myFile.h示例:

void printer (void);

以下是myFile.cpp中的打印机实现:

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

void printer ()
{
    cout<< "I am a printer";
}

这是我的main.cpp

#include "myFile.h"

int main ()
{
    printer();
    return 0;
}

现在,当我运行程序时,我收到了预期的错误:undefined reference to printer。但是当我在github或其他项目上看到代码时,我发现它们通常包含头文件而不是源文件。我也尝试使用标题保护ifndef,但仍然出现同样的错误。 主程序在以下情况下成功编译:

  1. 如果我在myFile.h中包含myFIle.cpp

  2. 如果我在主

  3. 中只包含myFile.cpp

    我在做同样的事情时的一般做法是什么?

4 个答案:

答案 0 :(得分:4)

您应该在关联过程中包含myFile.cpp

g++ myFile.cpp main.cpp

错误消息undefined reference to printer实际上是链接器错误,而不是编译器错误。

解释

如果仅使用g++ main.cpp编译器,则不会从myFile.cpp创建代码。他知道应该有一个带有签名void printer(void)的函数,但他现在还没有这个函数的位置。他完全忽略了这个事实,因为你可以提供预编译的目标文件(“myFile.o”)并在以后链接它们:

g++ myFile.cpp -c       # compile myFile.cpp
g++ main.cpp -c         # compile myFile.cpp
g++ myFile.o main.o     # link both files together.

-c将告诉g++仅编译文件,但不将它们链接到可执行文件。这是由链接器完成的(g++可能会在您的配置中调用ld。链接器将创建一个可执行文件,其中包含所有需要的库,如libc++和实际代码。

IDE备注

如果您使用IDE,请确保项目中包含所有需要的文件。这包括所有头文件和源文件以及其他库的链接选项。

答案 1 :(得分:1)

当您自己定义一个头文件并希望包含它时,您应该将其括在“”中,例如:

#include "myFile.h"

答案 2 :(得分:1)

#include "myFile.h" // would be better.

您似乎忘记了包含的"

答案 3 :(得分:0)

你应该使用

#include "myFile.h"

#include <myFile.h>

后者更适用于系统库。两种形式在搜索文件的方式上都不同。 您可以在

找到更多详细信息

http://msdn.microsoft.com/en-us/library/36k2cdd4%28v=vs.71%29.aspx