对C ++ #include感到困惑

时间:2012-08-15 10:59:44

标签: c++ class hyperlink compilation header

我的项目有这个文件夹结构:

Project/
--Classes/
----Class1.h
----Class1.cpp
--main.cpp

“Class1.h”包含方法定义,“Class1.cpp”是“Class1.h”的源代码。

“Class1.h”的源代码如下:

class Class1 {
  public:
    void do_something();
};

“Class1.cpp”的源代码如下:

#include "Class1.h"

void Class1::do_something() {
  //
} 

“main.cpp”的源代码如下:

#include "Classes/Class1.h"

int main(int argc,char** args) {
  Class1* var = new Class1();
  var->do_something();
  return 0;
}     

但是,在编译“main.cpp”时,编译器不知道Class1中方法的实现位置,因此它显示了有关未定义引用的链接错误。

我是否必须在命令行中添加任何路径,以便编译器知道它要编译的源文件是什么?如何告诉编译器它还必须编译“Class1.cpp”?

3 个答案:

答案 0 :(得分:5)

您需要将项目中的所有文件都提供给编译器,而不仅仅是“main.cpp”。 Here您可以阅读有关使用Gcc编译多个文件的基础知识。

另一种选择是将您的类编译为动态或静态库,但如果您不熟悉库,则应该从简单编译它们开始。

答案 1 :(得分:2)

执行此操作的正确方法是在Class1.cpp文件中包含标头。这样,如果将Class1.cpp编译为库,则可以使用头文件来获取声明。

反过来说,如果你直接使用Class1.cpp,用你的项目编译 。您应该在main.cpp中包含Class1.cpp

答案 2 :(得分:2)

您需要了解构建(编译和链接)C ++应用程序。这个主题通常不会在关于C ++的编程书籍中描述,只能用它来表达 - 谷歌和编程社区网站上的文章。

快速回答是:

g++ -c Classes/Class1.cpp -o Class1.o
g++ -c main.cpp -o main.o
g++ Class1.0 main.0 -o ProjectName

它是一组用于编译和链接程序的简单命令。通常它将由构建系统(make,qmake,cmake,waf,scons,ant等)完成。此外,IDE可以在没有其他配置的情况下构建程序,例如Visual Studio。