如何实现runner.cpp执行完成后自动运行TSP.cpp?附Makefile详细教程
当然有可行的实现方法!最适合你的需求的就是用Makefile——我知道你之前用不好,所以会一步步给你讲得明明白白,另外也会给你一个简单的shell脚本方案作为备选。
方法一:用Makefile实现(推荐)
Makefile的核心是规则,它会帮你自动化编译和执行流程,还能避免重复编译未修改的文件,非常适合你的场景。以下是针对你的需求的完整Makefile写法,每一行都有注释:
# 定义使用的编译器,这里用g++,如果习惯clang可以改成clang++ CC = g++ # 编译选项:开启所有警告、启用C++17标准(可根据你的需求调整版本) CFLAGS = -Wall -Wextra -std=c++17 # 定义生成的可执行文件名,对应你的两个cpp文件 RUNNER_EXEC = runner TSP_EXEC = tsp # 规则1:编译runner.cpp生成可执行文件 $(RUNNER_EXEC): runner.cpp # 注意!这里的缩进必须是Tab键,不能用空格!否则Make会报错 $(CC) $(CFLAGS) runner.cpp -o $(RUNNER_EXEC) # 规则2:编译TSP.cpp生成可执行文件 $(TSP_EXEC): TSP.cpp $(CC) $(CFLAGS) TSP.cpp -o $(TSP_EXEC) # 总目标:先执行runner,完成后再执行TSP # .PHONY标记告诉Make这不是一个实际的文件,避免和同名文件冲突 .PHONY: run-all run-all: $(RUNNER_EXEC) $(TSP_EXEC) # 先运行runner,只有当runner执行成功(返回码为0),才会执行下一行的TSP ./$(RUNNER_EXEC) ./$(TSP_EXEC) # 可选规则:清理生成的可执行文件,方便重新编译 .PHONY: clean clean: rm -f $(RUNNER_EXEC) $(TSP_EXEC)
怎么使用这个Makefile?
- 把上面的内容保存为
Makefile(首字母大写是规范写法,小写makefile也能识别),放在和你的两个cpp文件同一目录下。 - 打开终端,切换到该目录:
- 要自动编译并按顺序执行两个程序,输入:
make run-all - 如果只想编译不运行,输入:
make runner tsp - 要清理生成的可执行文件,输入:
make clean
- 要自动编译并按顺序执行两个程序,输入:
关键注意事项
- Tab键的问题:规则里的命令行必须用Tab键缩进,不能用空格,这是新手最容易踩的坑!
- 执行顺序控制:默认情况下,只有前一个命令执行成功(返回码为0),Make才会执行下一个命令。如果不管runner是否成功都要执行TSP,可以把两行命令改成:
./$(RUNNER_EXEC); ./$(TSP_EXEC)(用分号分隔)。
方法二:用Shell脚本实现(更简单直接)
如果觉得Makefile的规则有点绕,写个shell脚本会更直观,适合快速验证:
- 创建一个名为
run.sh的文件,内容如下:
#!/bin/bash # 先编译两个cpp文件(如果已经手动编译好,可以删掉这两行) g++ -Wall -Wextra -std=c++17 runner.cpp -o runner g++ -Wall -Wextra -std=c++17 TSP.cpp -o tsp # 先执行runner,成功后再执行TSP ./runner && ./tsp # 如果不管runner成功与否都要执行TSP,替换成下面这行: # ./runner; ./tsp
- 给脚本添加执行权限:在终端输入
chmod +x run.sh - 运行脚本:
./run.sh
补充说明
如果你的cpp文件依赖其他头文件或第三方库,需要在编译命令里添加对应的选项:
- 指定头文件目录:用
-I参数,比如g++ runner.cpp -o runner -I./include(假设头文件在include目录下) - 链接第三方库:用
-l参数,比如链接数学库用-lm,即g++ runner.cpp -o runner -lm
内容的提问来源于stack exchange,提问作者Kushagr Tyagi
相关产品推荐
相关产品推荐

