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在这个编辑过的文件上运行时,我的编译器抱怨"未定义的体系结构符号",我理解这意味着它无法找到被调用的类/方法的定义.
什么是我的导师和我做出不同的行为导致这种差异?为什么我的编译器需要一行导致她的编译器失败?
你应该从来没有直接包含的源文件.
相反,您应该在g++编译时列出命令中的所有源文件:
g++ Driver.cpp LineType.cpp MyOtherFile.cpp # etc...
Run Code Online (Sandbox Code Playgroud)
使用#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.o和LineType.o. 然后你可以通过运行将它们组合在一起
g++ Driver.o LineType.o
Run Code Online (Sandbox Code Playgroud)