仅使用生成文件动态编译选定的文件

compile only selected files dynamically using makefile

本文关键字:文件 编译 动态      更新时间:2023-10-16

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

它不仅仅是一个订单,a和b可以编译或b和c,或a和c或(a,b和c(一起编译。

我可以使用生成文件执行此操作吗?

不确定如何"比较"运行时,因此此示例仅通过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

(确保缩进是制表符(

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

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.

虽然编译器和生成文件可能会用于执行此操作,但 Id 建议您不要这样做。重组您的程序。

例如,我猜你有喜欢test_runner.cppalgorithm_a.cppalgorithm_b.cpp

例如,制作一个模板函数来测试算法。然后将其用于每个实现。

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

所以首先,将它们变成一个程序进行测试有什么不好?然后,您可以按顺序运行和计时这两种算法,或者您可以使用命令行参数?

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

还要花一些时间来学习生成文件语法。一旦你理解了语法解决方案应该是显而易见的,但仍然不是你应该应用于这种情况的东西。