C++ 如何在子目录中使用.cpp和.h文件?

C++ 如何在子目录中使用.cpp和.h文件?,c++,g++,C++,G++,这是我的系统中目录的内容: /directory/ classes/ class1.cpp class1.h main.cpp 以下是上述文件的内容: main.cpp #include "classes/class1.h" int main(){ class1 test; return 0; } 类别1.h class class1 { public:

这是我的系统中目录的内容:

/directory/
    classes/
        class1.cpp
        class1.h
    main.cpp
以下是上述文件的内容:

main.cpp

   #include "classes/class1.h"

   int main(){
       class1 test;
       return 0;
   }
类别1.h

   class class1 {
       public:
           class1();
           void test();
   };
类别1.cpp

   #include "class1.h"

   class1::class1(){
   }
   class1::test(){
   }
问题是为什么我不能编译
main.cpp

ghasemi@ghasemi-MS-7693:~/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

在主
目录中
只有一个
.cpp
文件,
*
通配符不在子目录中查找。您需要显式命名所有源文件,或者使用多个通配符(我不推荐这样做)

大概是

g++ main.cpp classes/class1.cpp

在主
目录中
只有一个
.cpp
文件,
*
通配符不在子目录中查找。您需要显式命名所有源文件,或者使用多个通配符(我不推荐这样做)

大概是

g++ main.cpp classes/class1.cpp

您正在搜索的内容与编译器(gcc)本身无关,而是与构建环境相关。有几种工具可以完成这项工作

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

这项工作最常见的是gnu make

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

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

所以请看一下

对于您的项目,它可以如下所示:

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

您正在搜索的内容与编译器(gcc)本身无关,而是与构建环境相关。有几种工具可以完成这项工作

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

这项工作最常见的是gnu make

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

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

所以请看一下

对于您的项目,它可以如下所示:

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

难道没有强制G++在所有子目录中搜索
cpp
文件吗?@Abraham不是GCC否。如果您使用Makefile,那么这是可能的,但我仍然建议您明确列出源文件。想想将来,您的根目录中可能有多个项目,每个项目都是一个单独的程序。盲目获取所有子目录中的所有源文件将导致问题。@Abraham使用像SCons或CMake这样的生成系统。您最好也告诉我们如何将文件链接到单个二进制文件中,这在答案中也很有用,我想。有没有办法强迫G++在所有子目录中搜索
cpp
文件?@Abraham没有。如果您使用Makefile,那么这是可能的,但我仍然建议您明确列出源文件。想想将来,您的根目录中可能有多个项目,每个项目都是一个单独的程序。盲目地获取所有子目录中的所有源文件将导致问题。@Abraham使用像SCons或CMake这样的生成系统。您最好也告诉我们如何将文件链接到单个二进制文件中,我认为这在回答问题时也很有用。