Processing math: 100%

写一个简单的 Makefile

参考来源:https://www.cnblogs.com/owlman/p/5514724.html

每次改动一个源代码文件以后,如果都要编译一次所有源代码,会浪费很多时间。Makefile 可以只编译更新过的源代码,节省时间。

比如:g++ main_solve.cpp qab.cpp -o Pandawarrior.x

可以写 Makefile, 内容为:

Pandawarrior.x : main_solve.cpp qab.cpp

  g++ -o Pandawarrior.x main_solve.cpp qab.cpp

第一句表示,Pandawarrior.x 依赖 main_solve.cpp 和 qab.cpp,如果其中任意一个更新了,就执行第二行(命令),即编译得到新的 Pandawarrior.x

编辑好 Makefile 以后,打 make 就可以按照新写的 Makefile 编译或者重编译。

 

为了方便改动,可以用字符代替 Pandawarrior.x 等等名字:

compiler = g++

excutable = Pandawarrior.x

source = main_solve.cpp qab.cpp

(excutable):(source)

  (compiler)o(excutable) $(source)

 

这样写以后,只要 main_solve.cpp,qab.cpp 有一个有变化,就全部重新编译一遍,和每次编辑以后打

g++ main_solve.cpp qab.cpp -o Pandawarrior.x

没有任何区别。所以并没有发挥 Makefile 的长处。可以改写为:

compiler = g++

excutable = Pandawarrior.x

src = main_solve.cpp qab.cpp

obj = main_solve.o qab.o

(excutable):(obj)

  (compiler)o(excutable) $(obj)

main_solve.o : main_solve.cpp

  $(compiler) -c main_solve.cpp

qab.o : qab.cpp

  $(compiler) -c qab.cpp

这样,如果改动 qab.cpp,重新编译时只会再次编译

g++ -c qab.cpp

g++ -o Pandawarrior.x main_solve.o qab.o

不会重新编译 main_solve.cpp,所以节省了时间。

但是这么写的话,太啰嗦了,如果 *.cpp 特别多,就会特别长,所以可以简写:

compiler = g++

excutable = Pandawarrior.x

headfile = $(shell find ./ -name "*.h")

src = $(shell find ./ -name "*.cpp")

obj = $(src:%.cpp=%.o)

(excutable):(obj)

  (compiler)o(excutable) $(obj)

%.o : %.cpp $(headfile)

  (compiler)c< -o $@

其中,headfile = $(shell find ./ -name "*.h") 里的 shell 是 Makefile 的一个函数,意思是执行 shell 中的命令,返回结果,所以这句意思是 headfine = "*.h",即文件夹下的所有 "*.h" 文件

$(src:%.cpp=%.o) 是一个“字符替换函数”,意思是将 src 中的所有 *.cpp 文件名换成相应的 *.o 文件名。

%.o : %.cpp 是一个“模式规则”,表示所有 *.o 文件都依赖于与之同名的 *.cpp 文件。

<@ 表示目标,即 %.o

 

后面还可以加一句

clean:

  rm -rf (obj)(excutable)

加了以后,可以打 make clean,即清除所有 *.o,以及 Pandawarrior.x 文件。

 

我已经按这个教程,给我的 PandasCommute 写了一个 Makefile,在 https://github.com/luyi07/PandasCommute.git,验证了一下,是成功的。

 GNU Make Manual.pdf 我已下载,供下次查阅。

 

函数声明可以写进 *.h 文件(头文件),然后包括进 *.cpp 文件,对 该 cpp 文件进行编译。貌似多个cpp文件都可以包括同一个头文件,单独对每个cpp文件进行编译,然后进行连接即可。

posted on   luyi07  阅读(183)  评论(0编辑  收藏  举报

编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示