1

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

这是一个例子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. 如果我只在 main 中包含 myFile.cpp

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

4

4 回答 4

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,请确保所有需要的文件都包含在项目中。这包括所有头文件和源文件以及其他库的链接选项。

于 2012-06-16T10:21:54.637 回答
1

当你自己定义一个头文件并想包含它时,你应该把它括起来“”,例如:

#include "myFile.h"
于 2012-06-16T10:21:05.880 回答
1
#include "myFile.h" // would be better.

似乎您忘记了"周围的包含。

于 2012-06-16T10:21:27.600 回答
0

你应该使用

#include "myFile.h"

或者

#include <myFile.h>

后者更适合系统库。两种形式在搜索文件的方式上有所不同。您可以在以下位置找到更多详细信息

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

于 2012-06-16T10:38:07.577 回答