如何在所有子目录中编译多文件C ++程序?

时间:2013-07-17 04:59:10

标签: c++ bash unix compilation

我有一堆C ++程序,每个程序都在自己的子目录中。每个子目录在几个文件中都有一个C ++程序 - 每个类的.h和.cpp文件加上一个主.cpp程序。我想编译每个程序将可执行文件放在相应的子目录中。 (我还想运行每个程序并将其输出重定向到放在相应子目录中的文件,但是如果我可以使编译工作,我应该没有问题找出这一部分。)

我在UNIX系统上使用bash shell(实际上是在Windows上运行的UNIX模拟器Cygwin)。

我已经设法在网上找到了一个用于编译当前目录中的单文件程序的简短脚本,但就我所知。该脚本如下。

for f in *.cpp;
   do g++ -Wall -O2 "$f" -o "{f/.cpp/}";
done;

我真的很感激有人可以帮助我。我需要平均每两周做一次这个任务(更像是连续8周,然后不是8周等)。

2 个答案:

答案 0 :(得分:3)

除非你是受虐狂,否则请使用makefile而不是shell脚本。

由于(显然)每个可执行文件都依赖于同一目录中的所有.h.cpp文件,因此makefile很容易编写 - 每个文件都有类似的内容:

whatever.exe: x.obj y.obj z.obj
   g++ -o whatever.exe x.obj y.obj z.obj

您还可以在每个目标中添加一个目标来运行生成的可执行文件:

 run:
     whatever.exe

通过它,您将使用make run来运行可执行文件。

然后你(可能)想在根目录中想要一个makefile,它在每个子目录中递归地生成目标,然后运行每个子目录(如上所述)。

这有几点好处 - 主要是它实际上是为这类任务而建的,所以它实际上做得很好。另一个是它记录了文件的时间戳,因此它只重建实际需要它的可执行文件(即,自可执行文件本身构建以来,至少有一个可执行文件所依赖的文件已被修改)。 p>

答案 1 :(得分:0)

假设你有一个目录,其所有直接子目录都是c ++程序,那么就使用一些变体......

for D in */; do cd "$D";
    # then either call make or call your g++ 
    # with whatever arguments in here
    # or nest that script you found online if it seems to
    # be doing the trick for you.
    cd ../;
done;

这将移动到每个目录,做它的事情(无论你想要的是什么),然后退回。