2016-10-31 38 views
0

这是在我的系统目录中的内容:如何在子目录中使用.cpp和.h文件?

/directory/ 
    classes/ 
     class1.cpp 
     class1.h 
    main.cpp 

这里是上述文件的内容:

的main.cpp

#include "classes/class1.h" 

    int main(){ 
     class1 test; 
     return 0; 
    } 

class1.h

class class1 { 
     public: 
      class1(); 
      void test(); 
    }; 

class1.cpp

#include "class1.h" 

    class1::class1(){ 
    } 
    class1::test(){ 
    } 

问题是为什么我无法编译main.cpp

[email protected]:~/Desktop/directory$ g++ *.cpp 
/tmp/ccEvIogL.o: In function `main': 
main.cpp:(.text+0x1f): undefined reference to `class1::class1()' 
collect2: error: ld returned 1 exit status 

回答

4

在你的主directory只有一个.cpp文件和*通配符不子目录看看。你需要明确地命名所有的源文件,或使用多个通配符(不是我推荐的)。

因此,像

g++ main.cpp classes/class1.cpp 
+0

是不是反正有动力G ++搜索所有的'cpp'文件的子目录? – Abraham

+0

@Abraham不是GCC编号。如果你使用Makefile,那么它是可能的,但我仍然建议你明确列出源文件。想想未来,你可能在根目录中有多个项目,每个项目都是一个单独的程序。只是盲目地获取所有子目录中的所有源文件将导致问题。 –

+0

@Abraham使用SCons或CMake等构建系统。 –

1

什么您正在寻找是不相关的编译器(GCC)本身,而是为构建环境。有几种工具可以完成这项工作。

如果您只从一堆文件开始,您可以每次编译每个文件。但是如果你的项目变得更大,那么一次又一次编译所有文件是非常耗时的,如果其中一些文件没有任何改变的话。

这个工作最常见的是gnu make。

你必须编写一个描述你的项目的配置。这个文件通常被称为“Makefile”。

在此定义: 如果文件发生更改,则必须编译哪些文件。 哪些文件必须链接在一起。 用于所有或单个文件的链接和编译的所有参数。 ...很多更

所以,请大家看看对https://www.gnu.org/software/make/manual/

为您的项目,也可以是这样的:

all: myprog 

main.o: main.cpp classes/class1.h 

classes/class1.o: classes/class1.cpp classes/class1.h 

myprog: main.o classes/class1.o 
    g++ main.o classes/class1.o -o myprog 
相关问题