北京建设投标网站iapp网站怎么做软件
2026/4/18 14:35:53 网站建设 项目流程
北京建设投标网站,iapp网站怎么做软件,全国住房和城乡建设厅网站,企业邮箱大全号码大全#x1f3ac; 个人主页#xff1a;Vect个人主页#x1f3ac; GitHub#xff1a;Vect的代码仓库#x1f525; 个人专栏: 《数据结构与算法》《C学习之旅》《Linux》⛺️Per aspera ad astra. 文章目录Makefile0. 简单代码演示1. Makefile结构及规则变量定义部分默认目标部分… 个人主页Vect个人主页 GitHubVect的代码仓库 个人专栏: 《数据结构与算法》《C学习之旅》《Linux》⛺️Per aspera ad astra.文章目录Makefile0. 简单代码演示1. Makefile结构及规则变量定义部分默认目标部分编译目标部分清理目标部分2. 过程推导目标文件.o和依赖关系规则推导过程时间戳伪目标gdb和cgdbMakefile0. 简单代码演示// add.h#pragmaonceintadd(inta,intb);// add.cpp#includeadd.hintadd(inta,intb){returnab;}// main.cpp#includeiostream#includeadd.hintmain(){std::coutadd(1,2)std::endl;return0;}1. Makefile结构及规则这里先提前有个认知Makefile是文件make是指令先来看代码然后解读# 变量定义部分SRCmain.cpp add.cpp OBJ$(SRC:.cpp.o)BINmyapp# 默认目标$(BIN):$(OBJ)g -o$$^# 编译目标%.o: %.cpp g -c $-o$# 清理目标.PHONY: clean clean:rm-f$(OBJ)$(BIN)变量定义部分SRC main.cpp add.cpp作用定义源文件变量包含所有.cpp的源文件解释SRC是一个包含需要编译的源文件的列表OBJ $(SRC:.cpp.o)作用通过模式替换将SRC中的.cpp全部转换成.o文件解释$(VAR)用来引用一个变量的值$(SRC:.cpp.o)利用替换模式得到OBJ main.o add.oBIN myapp作用定义最终生成的目标文件名最后的可执行文件默认目标部分$(BIN):$(OBJ)作用表示目标$(BIN)依赖于$(OBJ)中的main.o add.og -o $ $^作用使用g将.o文件链接成最终可执行文件myapp解释$代表当前规则中的目标文件这里是$(BIN)$^代表所有的依赖文件去除重复的这里是$(OBJ)编译目标部分%.o: %.cpp作用表示一条通用规则告诉make如何将.cpp文件编译成.o文件解释%是通配符代表一个任意的字符序列这里表示会匹配所有的.cpp文件将它们全部编译为对应的.o文件g -c -o $作用使用g将.cpp文件编译成.o文件解释$代表当前规则中的第一个依赖文件在这里就是.cpp文件$表示当前规则中的目标文件在这里是.o文件清理目标部分.PHONY: clean作用声明clean是一个伪目标而不是文件名解释make会认为clean是一个任务而不是文件因此即使当前目录下存在名为clean的文件make也会执行clean规则的命令clean: rm -f $(OBJ) $(BIN)作用clean目标的命令部分删除所有生成的目标文件和最终的可执行文件。2. 过程推导目标文件.o和依赖关系main.o依赖于main.cppadd.o依赖于add.cpp在Makefile中$OBJ是要生成的目标文件它的生成依赖于.cpp文件规则推导过程make会从默认目标myapp开始通过依赖关系逐步推导出需要做的工作make看到myappmyapp的形成依赖于main.o和add.omake会从main.o和add.o开始推导生成main.o而main.o的生成又依赖于main.cpp所以make会执行g -c main.cpp -o main.o生成add.o同理add.o的生成依赖于add.cpp所以make会执行g -c add.cpp -o add.o链接成myapp当生成了main.o和add.omake会执行g -o mayapp main.o add.o推导是一个出栈入栈的过程出栈make开始时看到myapp出栈myapp处理它的依赖main.o和add.o**入栈**当main.o和add.o处理完后它们的目标文件会入栈然后make执行生成myapp的命令我们梳理清楚依赖链目标直接依赖构建规则myappmain.oadd.og -o myapp main.o add.omain.omain.cppg -c main.cpp -o main.oadd.oadd.cppg -c add.cpp -o add.oclean伪目标rm -f main.o add.o myapp时间戳make在做依赖关系推导的时候会用时间戳来决定哪些目标需要重新构建时间戳的作用make会比较每个目标文件和它的依赖文件的时间戳如果依赖文件比目标文件新make会重新构建目标文件如果目标文件存在且没有被更新make会跳过编译过程[vectVM-0-11-centos make_file]$statmain.cpp File: ‘main.cpp’ Size:102Blocks:8IO Block:4096regularfileDevice: fd01h/64769d Inode:1051720Links:1Access:(0664/-rw-rw-r--)Uid:(1002/ vect)Gid:(1002/ vect)Access:2025-12-1420:12:03.883557588 0800 Modify:2025-12-1420:12:01.955499062 0800 Change:2025-12-1420:12:01.955499062 0800 Birth: -看一下三种时间Acesstime访问时间文件内容被读取/访问的时间Modifytime修改时间文件时间内容被修改的时间文件大小、内容变化Changetime状态改变时间文件**元数据属性**改变的时间文件属性过程演示第一次运行makemake的行为[vectVM-0-11-centos make_file]$makeg -c main.cpp -o main.o g -c add.cpp -o add.o g -o myapp main.o add.o此时目标文件和可执行文件都生成了时间戳被记录修改源文件并运行make假设修改了add.cpp文件中的代码例如intadd(inta,intb){returna*b;// 修改了加法为乘法}现在make会根据文件时间戳决定是否重新编译main.o时间戳未变化main.cpp不重新编译add.o文件的时间戳比add.cpp新make会发现add.o的依赖文件add.cpp发生变化运行指令得到[vectVM-0-11-centos make_file]$makeg -c add.cpp -o add.o g -o myapp main.o add.o不做任何修改直接运行make[vectVM-0-11-centos make_file]$makemake: myapp is up to date.总结目标文件不存在如果目标文件.o或依赖文件.cpp不存在make会强制编译并生成目标文件。依赖文件更新如果依赖文件的时间戳比目标文件更新make会重新编译依赖文件并更新目标文件。无更新时跳过编译如果目标文件和依赖文件的时间戳都没有变化make会跳过编译过程避免重复工作。伪目标伪目标没有对应文件的目标文件用来执行命令而不关心文件的存在伪目标不会检查时间戳每次执行都会运行相关指令.PHONY: clean clean:rm-f$(OBJ)$(BIN).PHONY告诉makeclean是伪目标即使当前目录下有一个clean文件make也不会认为它是一个文件而是会执行rm命令gdb和cgdb

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询