2012-10-18 65 views
2

我有几个.cpp和.hpp文件。我想编译并使用make来使用它们。我怎样才能做到这一点 ?如何编译多个文件使得

sample.cpp sample.hpp 
    sample_2.cpp sample_2.hpp 
    sample_3.cpp sample_3.hpp 
    ... 
    and 
    main.cpp 

    I have done : 

    default: 

      g++ -c sample sample.cpp 
      g++ -c sample_2 sample_2.cpp 
      g++ -c sample_3 sample_3.cpp 

      g++ -o main main.cpp sample sample_2 sample_3 

当I型作出终端,它提供错误:

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10 
+0

阅读gcc手册和make手册。至少,学习如何在没有make的情况下实现你想要的shell。 –

+0

如果您的'make'甚至不执行,请重新安装它。 – EJP

回答

3
相反

具有单个default目标,做一切每个单独的输出应该是一个make目标的。这允许make正常工作,一次构建一件事,按照正确的顺序(或者如果依赖关系图允许的话,并行地)并且在每个步骤正确地报告错误。另外,非常重要的是,通过讲述关于每个单独目标以及它们依赖于的内容,确保当依赖性发生变化时,由于依赖性发生变化,make会准确知道需要重新构建哪些目标。这是Make的最佳功能。

在你的情况下,最终的目标是main所以你想要的default目标说main构建,你要做的就是main的先决条件:

default: main 

现在你需要说如何建立main ,这取决于不同的目标文件,所以我们告诉作出这样的:

main: main.o sample.o sample_2.o sample_3.o 

这表示这取决于这些目标文件(它们是其prerequsites),所以他们会b首先建成。这些对象中的每一个都是另一个将单独构建的制作目标。

当所有先决条件已建成配方将被用于将它们连接到main,所以我们需要一个配方添加到上述目标:

main: main.o sample.o sample_2.o sample_3.o 
     g++ main.o sample.o sample_2.o sample_3.o -o main 

制作有很多的缩写来简化事情,例如$(CXX)是C++编译器,[email protected]意味着当前目标和$^意味着当前目标的先决条件,这样你就可以简化规则:

main: main.o sample.o sample_2.o sample_3.o 
     $(CXX) $^ -o [email protected] 

这实际上是你所需要的,让已经知道如何使用来构建.o先决条件它的内置规则,所以它会看到一个名为main.cpp的文件,并且知道它可以编译创建main.o,并参见sample.cpp并将其编译为sample.o等。它将从makefile创建一个依赖关系图来决定需要哪些目标以便建立default(这意味着它决定需要main,需要main.osample.o等,他们需要main.cppsample.cpp等,这些已经存在,所以它可以开始建设的先决条件,直到它必须然后链接main所需要的一切就可以做到这一点,光洁度。)

现在,如果你改变sample_2.cpp和再次运行make会看到sample_2.o已过期,需要重新编译,但其他.o文件还行(它们是新的,然后它们所依赖的.cpp文件),因此它会重新编译sample_2.o和重新链接main而不是重建一切

事实上,你甚至可以进一步简化它,使用默认的配方链接对象成可执行:

LINK.o = $(CXX) 

default: main 

main: main.o sample.o sample_2.o sample_3.o 

这就是你所需要的!但是,对于初学者来说,通常会更清晰地使用更详细的版本,因为当您不熟悉Make的所有自动规则和变量时,定制更容易。

告诉make有关头文件的依赖关系也很有帮助,这样当头文件发生变化时,事情就会重建。这可以使用编译器自动完成,以生成先决条件,但对于简单的情况,您可以直接将其添加到makefile中,例如,

sample.o: sample.hpp sample.cpp 
+0

主要的是,我使用了样本A; sample.cpp中的类名是Sample-。然后,当我编译时,在此范围内未声明错误Sample。我该怎么办?我用'LINK.o = ...'来编译我的代码。 – user1743323

+1

这听起来像是一个完全不同的问题,你有#include定义'Sample'的头文件吗?也许你应该在C++和“独立编译”模型中找到一本很好的教程或书籍 –