百科知识

linux创建文件,超简单的方法教你如何轻松创建新文件

对于从事软件开发工作的程序员们而言,Makefile无疑是一个必须跨越的门槛。或许对于那些长期使用Visual C++开发环境的开发者来说,是否掌握Makefile的编写似乎并不重要。毕竟,开发工具已经为我们自动处理了整个编译流程。然而在Linux操作系统环境下,情况截然不同——没有任何人会为你预先设置好这一切。无论是编写代码、进行测试,还是实现编译流程的自动化,都需要依靠自己的力量来完成。

Makefile入门指南首先,让我们通过一个实例来阐述Makefile的编写规范,以便读者能够建立起初步的认识。我们的编写原则如下:1)如果该工程尚未进行过编译,那么所有的C语言源文件都需要被编译并最终链接成可执行程序。2)如果工程中的部分C语言源文件发生了变更,我们只需重新编译这些被修改的文件,并将其链接到目标程序中。3)如果工程中的头文件得到了更新,那么所有引用了这些头文件的C语言源文件都需要重新编译,随后将它们链接成最终的目标程序。只要我们的Makefile设计得当,上述所有工作都可以通过一个简单的make命令来完成。make命令会智能地根据当前文件状态的变化,自动判断哪些文件需要重新编译,并执行相应的编译和链接操作。

代码实例展示:

由于这个示例程序相对简短,我们可以手动执行以下编译命令:

gcc -c main.c gcc -c mytool1.c gcc -c mytool2.c gcc -o main main.o mytool1.o mytool2.o 这样我们同样能够生成main程序,而且操作过程并不复杂。但是,如果我们考虑一个更复杂的情况:假设有一天我们修改了其中一个文件(例如mytool1.c),难道还要重复输入上述命令吗?或许你会认为,这很容易解决,我可以编写一个SHELL脚本来自动完成这些任务。是的,对于这个简单的程序来说,脚本确实能够起到作用。但是,当我们把问题复杂化一些,如果我们的程序包含数百个源文件,难道也要让编译器逐个重新编译吗?为了解决这一难题,聪明的程序员们开发出了一种强大的工具——make。只需执行一次make命令,就可以轻松应对上述挑战。在我们执行make命令之前,需要先创建一个至关重要的文件——Makefile。以我们上面的程序为例,可能的Makefile内容如下:

这是上面那个程序的Makefile文件:

拥有了这个Makefile文件,无论我们何时修改了源程序中的任何文件,只需执行make命令,编译器就只会编译与我们修改的文件相关的部分,而不会浪费时间处理其他无关的文件。那么,Makefile是如何编写的呢?在Makefile中,以#符号开头的行都是注释行。Makefile的核心内容在于描述文件之间的依赖关系。

通常的格式如下:

target:components  

TAB rule

第一行表示依赖关系,第二行则是具体的规则。

例如,上面提到的Makefile文件的前两行:

main:main.o mytool1.o mytool2.o  

这表示目标(target)main依赖于main.o、mytool1.o和mytool2.o这三个组件。当依赖对象在目标修改后发生变化时,就需要执行规则行所指定的命令。就像我们上面那个Makefile的第二行所定义的:gcc -o main main.o mytool1.o mytool2.o 注意规则行中的TAB符号,它代表了一个制表符。

如果要删除可执行文件和所有中间目标文件,只需简单地执行”make clean”命令即可。

Makefile提供了三个非常有用的变量,分别是$@、$^和$<,它们分别代表以下含义:

$@ 目标文件

$^ 所有依赖文件

$< 第一个依赖文件  如果我们合理使用这三个变量,可以进一步简化Makefile的编写。经过简化后,我们的Makefile变得更加简洁明了,但仍有进一步优化的空间。

接下来,我们学习一个Makefile的默认规则:

.c.o: 

 gcc -c $<

这个规则表示所有的 .o文件都依赖于相应的.c文件。例如mytool.o依赖于mytool.c,这样一来,Makefile还可以进一步精简为:

至此,我们的Makefile基本完成。若想了解更多关于Makefile的规则,建议查阅相关技术文档。

最后,总结一下make命令的执行流程:

1)make命令首先在当前目录下查找”Makefile”或”makefile”文件

2)如果找到,则定位文件中定义的第一个目标文件(target),例如上面的例子中的main

3)如果main目标依赖于其他命令产生的文件,则先执行相关命令

4)当main目标所需的文件准备就绪后,执行main目标对应的命令

注:需要C/C++、Linux服务器开发学习资料私信“资料”(资料涵盖C/C++、Linux、golang技术、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN、P2P、K8S、Docker、TCP/IP、协程、DPDK、ffmpeg等),免费分享