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

相关文章

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

MySQL 安装配置超完整教程

《MySQL安装配置超完整教程》MySQL是一款广泛使用的开源关系型数据库管理系统(RDBMS),由瑞典MySQLAB公司开发,目前属于Oracle公司旗下产品,:本文主要介绍MySQL安装配置... 目录一、mysql 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Logback在SpringBoot中的详细配置教程

《Logback在SpringBoot中的详细配置教程》SpringBoot默认会加载classpath下的logback-spring.xml(推荐)或logback.xml作为Logback的配置... 目录1. Logback 配置文件2. 基础配置示例3. 关键配置项说明Appender(日志输出器

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设