当前位置: 首页 > Linux

【小白的动手时间】linux下手写makefile编译多文件程序

时间:2023-04-06 05:19:29 Linux

让编译更智能环境:ubuntu18.04背景知识make是一款自动编译工具,解决了手动编译链接的麻烦。如果您的系统没有安装它(您可以键入make-version来检查),请尝试键入sudoapt-getinstallmake来安装它。使用make需要写一个makefile,主要描述需要的目标文件和文件之间的依赖关系,告诉make如何执行指令来实现“自动化”编译。步骤首先,准备一个多文件程序,放在某个目录下,比如hello.c(提供一个sayhello()函数)和test.c(在main函数中调用sayhello()),最好是你在清除生成的文件之前编译它。然后,在同一目录下创建一个vimmakefile,输入以下内容并保存退出:test:test.ohello.occtest.ohello.o-otesttest.o:test.ccc-ctest.chello.o:hello.ccc-chello.cmakefile的内容主要是以下内容的重复:Target:依赖文件要执行的命令然后输入make命令,可以看到make自动执行了以下命令:gcc-ctest.cgcc-chello.cgcctest.ohello.o-otest如果单独删除test,再次执行make,会发现make执行了如下命令:gcctest.ohello.o-otestcan注意make会根据指令的依赖关系和组合文件的存在来执行操作。另外,请注意make将使用第一个出现的目标作为最终目标,这也是检查依赖性和文件存在性的起点。最后,手动编写makefile后,如果我们修改源文件,删除原来的目标文件(rm文件名),执行m??ake命令,得到一个新的目标文件。补充一下make的自动推断相信大家一定有这种感觉——hello.o:hello.c...这样的说法太蠢了,我只想把C文件编译成同名的.o文件,可以它不能更聪明吗?其实是可以的。make具有自动推导的能力,可以自动将依赖关系中出现的.o文件同名的.c文件添加到依赖关系中。然后,如果.o文件不存在或者要更新,make会执行相应的命令生成它。明白了这一点,我们的makefile就可以这样改写了:是一个文本字符串,在使用时会展开。定义变量的方式如下:objects=test.ohello.o变量使用示例如下:test:$(objects)cc$(objects)-otest所以,在了解了make中的变量之后,我们的makefile可以改成这样:target=testobjects=test.ohello.o$(target):$(objects)cc$(objects)-o$(target)cleaninmake你一定觉得需要手动每次更新目标文件删除似乎不是很聪明——幸好有一个稍微“自动化”的解决方案,就是添加干净。使用clean的例子如下(通常建议把这部分放在makefile的末尾):clean:rmtest$(objects)因为找不到依赖,所以当clean后面的指令不会被执行使用命令make。如果要执行这部分内容,需要输入makeclean。其他关于make的还没写2333,见参考链接。参考链接:https://tnie.github.io/2016/0...https://blog.csdn.net/haoel/a...