我尝试使用c ++将一个类放在一个单独的文件中,但不包含.cpp文件,它不起作用。
这是类示例的CPP文件
//Example.cpp
#include "Example.h"
#include<iostream>
using namespace std;
Example::Example()
{
cout<<"I am am Executed\n";
}
这是头文件
//Example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
class Example
{
public:
Example();
};
#endif
现在,如果我不将C ++文件包含在我的主函数文件中,则会发出错误
#include "Example.h"
//#include "Example.cpp"
#include<iostream>
using namespace std;
int main()
{
Example aak;
return 0;
}
所以在这里我已经注释掉了 // #include&#34; Example.cpp&#34; ,它会给我一个错误说明
/tmp/ccuHMRJB.o: In function `main':
main.cpp:(.text+0x10): undefined reference to `Example::Example()'
collect2: ld returned 1 exit status
但是如果我取消注释#include&#34; Example.cpp&#34;它工作得很好!给我一个输出
我被执行了!
我不明白为什么我需要包含两个文件(.h和.cpp)来执行程序。只要我认为它应该只包含.h文件,但它没有......
答案 0 :(得分:1)
您应该不在其他.cpp
个文件中包含.cpp
个文件。而是在编译器命令行上列出构成项目的所有.cpp
文件。
答案 1 :(得分:0)
您应该将.cpp
文件添加到项目或makefile中。必须编译.cpp
文件并将其链接到您的项目。
并避免在代码中包含.cpp
个文件。
在您的情况下,编译器在对象(已编译)文件中查找Example::Example()
的正文,但找不到它。
答案 2 :(得分:0)
这是因为当您包含cpp文件时,文件(即函数)也正在编译。但是当你包含原型文件,即头文件时,你还必须指定在哪里搜索功能代码的可执行代码。表示链接器将找到以二进制形式存储cpp文件的库(已编译),否则需要进行编译。我认为后者是你的情况(即你没有从你的cpp文件创建一个库)。现在想想如果你不包含cpp文件就不会被编译。然后你正在调用一个二进制代码不存在的函数。
因此,如果您不包含cpp文件
,则链接器会抛出错误