使用makefile动态编译所选文件

时间:2017-08-25 14:12:28

标签: c++ makefile

我想知道是否有使用makefile动态编译的方法。 假设我有a.cppb.cppc.cpp个文件。这些是我想比较运行时的算法。 首先,我只想编译a和b文件,然后执行以查看结果。 接下来,我想编译b和c并运行。

这不仅仅是一个订单,a和b可以编译或b和c,或a和c或(a,b和c)完全一致。

我可以使用makefile吗?

3 个答案:

答案 0 :(得分:1)

不确定您希望如何“比较”运行时,因此此示例仅通过time命令打印它们,但您可以使用awk和gnuplot生成图表(如果需要)。每个目标只是指定要运行的shell命令。 %用于根据模式定义目标。

all: ab bc

%.out: %.cpp
    gcc $< -o $@

ab: a.out b.out
    time ./a.out && time ./b.out

bc: b.out c.out
    time ./b.out && time ./c.out

(确保缩进是制表符)

答案 1 :(得分:1)

是的,这只是依赖性排序的问题:它看起来像:

all: results_ab results_bc
     #compare results...

results_ab: a.o b.o
     # link, and run, and store results

results_bc: results_ab b.o c.o
     # link, run and store results.

答案 2 :(得分:0)

虽然可能会使用编译器和makefile来执行此操作,但我建议您不要执行此操作。重组您的计划。

e.g。我猜您喜欢test_runner.cppalgorithm_a.cppalgorithm_b.cpp

e.g。制作一个模板函数,让algorthim进行测试。然后将其用于每个实现。

template<class T> void test_implementation() { ... do stuff with T to test it ... }

void main()
{
    test_implementation<A>();
    test_implementation<A>();
}

首先,将它们整合到一个测试程序中有什么不好?然后你可以按顺序运行和计算两种算法,或者你可以使用命令行参数?

另外,如果你认为test_runner.cpp是一个库,那么你要测试的两个算法是单独的程序,只是使用那个库。

还需要一些时间来学习makefile语法。一旦你理解了语法解决方案应该是显而易见的,那么你仍然应该适用于这种情况。