我什么时候需要#include .cpp文件?

Jes*_*lan 1 c++ include header-files

我的一个作业涉及三个文件:LineType.h,LineType.cpp和Driver.cpp.Driver.cpp包含main()方法,该方法使用LineType.h和LineType.cpp定义的类.

在我的系统上,Driver.cpp以:

#include "LineType.h"
#include "LineType.cpp"
#include <iostream>
Run Code Online (Sandbox Code Playgroud)

当我g++ Driver.cpp通过命令行在项目目录中运行时,程序编译并运行完美.但是,当我的教师尝试编译程序时(我相信她使用Eclipse),它无法编译.经过一番来回,她能够通过评论一个来自Driver.cpp的#includes来解决问题:

#include "LineType.h"
//#include "LineType.cpp"
#include <iostream>
Run Code Online (Sandbox Code Playgroud)

当我尝试g++ Driver.cpp在这个编辑过的文件上运行时,我的编译器抱怨"未定义的体系结构符号",我理解这意味着它无法找到被调用的类/方法的定义.

什么是我的导师和我做出不同的行为导致这种差异?为什么我的编译器需要一行导致她的编译器失败?

Frx*_*rem 7

你应该从来没有直接包含的源文件.

相反,您应该在g++编译时列出命令中的所有源文件:

g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc...
Run Code Online (Sandbox Code Playgroud)

  • 对于懒惰的初学者,使用`g ++*.cpp`,你将得到目录中的每个cpp文件. (2认同)

Mar*_*tek 5

使用#include somefilename意味着somefilename 的内容被放置在包含的位置。
通过放入#include "LineType.cpp"Driver.cpp 文件,您可以有效地将所有内容都放在一个文件中,然后使用 using 编译g++ Driver.cpp对您来说效果很好。
当您的教师使用 IDE 进行编译时,它进行了单独的编译和链接。所以它编译了 Driver.cpp 和 LineType.cpp 这两个文件都包含 LineType.cpp 的定义,因为它包含。因此,当涉及到链接时,她在 LineType.cpp 中定义了两次,而链接器不知道该怎么做。您可以使用以下命令一次编译和链接多个文件

g++ Driver.cpp LineType.cpp 
Run Code Online (Sandbox Code Playgroud)

或者使用单独的编译和链接命令

g++ -c Driver.cpp
g++ -c LineType.cpp
Run Code Online (Sandbox Code Playgroud)

这将生成文件Driver.oLineType.o. 然后你可以通过运行将它们组合在一起

g++ Driver.o LineType.o
Run Code Online (Sandbox Code Playgroud)