我听说我们应该在头文件和源文件中的定义中编写声明,源和头都具有相同的名称。然后只在源代码中包含标题。
以下是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
,但仍然出现同样的错误。
主程序在以下情况下成功编译:
如果我在myFile.h中包含myFIle.cpp
如果我在主
我在做同样的事情时的一般做法是什么?
答案 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,请确保项目中包含所有需要的文件。这包括所有头文件和源文件以及其他库的链接选项。
答案 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