makefiles快速上手简单教程

2023-11-03 14:32
文章标签 简单 教程 快速 makefiles

本文主要是介绍makefiles快速上手简单教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:http://mrbook.org/tutorials/make/

jubincn的中文翻译http://blog.csdn.net/jubincn/article/details/7161631

书写长长的编译命令是很枯燥无聊而又费时的,尤其是包含多个文件的编译命令。令人高兴的是这种人们必须在命令行中敲入编译的命令的时代已经结束了,因为我们将使用makefie,在make工具的帮助下实现自动化编译。Makefiles是遵循make工具可以识别的语法规则编写的文件,可以看作是make的脚本程序。此文中将用到下面这些文件:

  • main.cpp
  • hello.cpp
  • factorial.cpp
  • functions.h
我建议您将这些文件放到一个单独的文件夹中来使用。

备注:文中我使用了g++。您可以使用任意的编译器来代替文中的g++。

我运行这些文件后发现有问题,做了如下修改:针对main.cpp和hello.cpp两个文件,将<iostream.h>换成<iostream>即可;两个文件都添加:using namespace std;


make工具的使用

如果您在命令行中执行

make

那么make工具将在当前目录中查找是否有名为“makefile”的文件并执行。如果您有多个makefiles文件,那么您可以使用-f参数来指定将要执行的makefile:

make -f mymakefile

make还有一些其它的参数,若需更多信息,请man make

Build过程

  1. 编译器将源文件编译成object文件
  2. 连接器将object文件链接成可执行文件

手动编译

命令行中直接调用编译器/连接器来的方式:

g++ main.cpp hello.cpp factorial.cpp -o hello

Makefile基本结构

Makefile的基本结构包括:

target: dependencies 

[tab] system command

按照这种格式,我们的makefile可以写成这样:

all:

       g++ main.cpp hell.cpp factorial.cpp -o hello

[Download here]

若执行这个makefile,在命令行中输入:

make -f Makefile-1

在第一个例子中,我们定义了一个名为all的target。这是Makefile的默认target,如果没有指定其它target的话,make将会执行这个target。在这里,target all没有指定dependencies,所以make就直接执行g++命令了。

使用依赖

很多时候使用多个target是很有好处的。如果你仅仅是修改了工程中的一个文件,那么make只需修改那个文件相关的target,而不需要将工程中的文件全部重新编译一遍。

下面是使用多个target的Makefile:

all: hello

hello: main.o factorial.o hello.o

        g++ main.o factorial.o hello.o -o hello

main.o: main.cpp

        g++ -c main.cpp

factorial.o: factorial.cpp

        g++ -c factorial.cpp

hello.o: hello.cpp

        g++ -c hello.cpp

clean:

         rm -rf *.o hello

[Download here]

在这里,target all 只有一个dependencies,没有系统命令。make会首先满足all的依赖,方法是搜索依赖的target,并执行。依赖的target也许有自己的依赖和命令,那么这个过程递归进行,知道所有的依赖都得到满足。在这个例子中,我们看到有个名为clean的target。这个一般都是用于清理所有的objects和可执行文件。

使用变量和注释

在Makefile中,您也可以定义和使用变量。当需要批量修改编译器参数时,使用变量是很方便的。

#I am a comment, and I want to say that the variable CC will be

#the compiler to use

CC=g++

#Hey! I am comment nuber 2, I want to say that CFLAGS wiil be the

#options I'll pass to the compiler

CFLAGS=-c -Wall

all: hello

hello: main.o factorial.o hello.o

        $(CC) main.o factorial.o hello.o -o hello

main.o: main.cpp

        $(CC) $(CFLAGS) main.cpp

factorial.o: factorial.cpp

        $(CC) $(CFLAGS) factorial.cpp

hello.o: hello.cpp

        $(CC) $(CFLAGS) hello.cpp

clean:

        rm -rf *.o hello

[Download here]

正如上面所示,变量是十分有用的。定义和使用变量的方式很简单,在写target之前将一个值赋给一个变量即可完成定义,使用$(VAR)可以获得变量值。


下一步的学习

完成文中的例子后,您已经可以写一个基本的makefile了。然而,这里的东西仅仅是冰山一角,我没指望所有人都能在不查Make documentation的情况下完全理解下面的代码(即使我自个儿也得查了才明白)。

CC=g++

CFLAGS=-c -Wall

LDFLAGS=

SOURCES=main.cpp hello.cpp factorial.cpp

OBJECTS=$(SOURCES: .cpp =.o)

EXECUTABLE=hello

all: $(SOURCES): $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)

         $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:

         $(CC) $(CFLAGS) $< -O $@

[Download here]

如果您能理解这段代码,那么无论您的工程含多少个文件,只需修改其中两行这个makefile便可用于您的工程。

最后一个makefile文件没有看懂,得好好研究一下了。


参考文献:

http://mrbook.org/tutorials/make/

http://blog.csdn.net/jubincn/article/details/7161631

http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D

http://web.mit.edu/gnu/doc/html/make_3.html

http://www.cs.umd.edu/class/fall2002/cmsc214/Tutorial/makefile.html





这篇关于makefiles快速上手简单教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338833

相关文章

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c