专栏首页howtouselinuxmakefile 如何 使用

makefile 如何 使用

目的:掌握make的用法,Makefile的内容,能在linux下C++编程。

环境:ubuntu 15.10

准备:三个文件 test1.cpp, test2.cpp, test2.h

test1.cpp

#include "test2.h"

int main() {

printf("Print test1!\n");

test2Print();

return 0;

}

test2.cpp

#include "test2.h"

void test2Print() {

printf("Print test2!\n");

}

test2.h

#include <cstdio>

#include <cstring>

#include <iostream>

#include <algorithm>

using namespace std;

void test2Print();

(1)基础:

Makefile文件

firstTest:test1.o test2.o

g++ test1.o test2.o -o firstTest

test1.o:test1.cpp test2.h

g++ -c test1.cpp -o test1.o

test2.o:test2.cpp test2.h

g++ -c test2.cpp -o test2.o

clean:

rm -rf *.o firstTest

一个Makefile主要含有一系列的规则,如下:

X:Y

(tab)<command>

每个命令行前必须要有tab符号(如Makefile中书写方法)

上面的Makefile文件就是要编译出一个firstTest的可执行文件,逐句分析:

firstTest:test1.o test2.o :firstTest依赖于test1.o、test2.o两个目标文件

g++ test1.o test2.o -o firstTest:编译出可执行文件firstTest。-o表示你指定的可执行文件名称

test1.o:test1.cpp test2.h :test1.o依赖于test1.cpp、test2.h两个文件

g++ -c test1.cpp -o test1.o:编译出test1.o文件,-c表示只把给它的文件编译成目标文件,用源码文件的文件名命名,但把其后缀由“.cpp”变成“.o”。

此句中可以省略-o test1.o,编译器默认生成test1.o文件。

clean:

rm -rf *.o firstTest:当键入make clean的时候,会删除所有.o文件和firstTest文件

如果要编译c文件,把g++改成gcc即可。

Makefile写好后,在命令行直接键入make命令,就会执行Makefile中的内容了。此例子的话,最终会产生firstTest可执行文件。

Understanding Makefile With Examples

注:如果一行写的内容过多,可以用“\”来分解多行,注意“\”后面不加空格,用以上的例子,顺便把-o test1.o去掉了:

firstTest:test1.o \

test2.o

g++ test1.o test2.o \

-o firstTest

test1.o:test1.cpp test2.h

g++ -c test1.cpp

test2.o:test2.cpp test2.h

g++ -c test2.cpp

clean:

rm -rf *.o firstTest

(2)Makefile中使用变量

OBJS = test1.o test2.o

G = g++

CFLAGS = -Wall -O -g

firstTest:$(OBJS)

$(G) $(OBJS) -o firstTest

test1.o:test1.cpp test2.h

$(G) $(CFLAGS) -c test1.cpp

test2.o:test2.cpp test2.h

$(G) $(CFLAGS) -c test2.cpp

clean:

rm -rf *.o firstTest

在这里我们使用了变量。变量设置的格式是“varName = content”;以后要引用这个变量,只需要用$即可,$(varName)。

CFLAGS = -Wall -O -g 配置编译器设置,并把它赋值给CFLAGS变量

-Wall:输出所有警告信息

-O:在编译时进行优化

-g:表示编译debug版本

这样写的Makefile比较简单,但是缺点显著。那就是要列出所有的.cpp文件。就好比你添加一个.cpp文件,就需要修改Makefile文件,这样子还是很麻烦的。

(3)使用函数

C = gcc

G = g++

CFLAGS = -Wall -O -g

TARGET = ./firstTest

%.o:%.c

$(C) $(CFLAGS) -c $< -o $@

%.o:%.cpp

$(G) $(CFLAGS) -c $< -o $@

SOURCES = $(wildcard .c .cpp)

OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))

$(TARGET):$(OBJS)

$(G) $(OBJS) -o $(TARGET)

chmod a+x $(TARGET)

clean:

rm -rf *.o firstTest

<1>函数wildcard:

产生一个所有以'.c'结尾的文件列表。

SOURCES = $(wildcard .c .cpp) 表示产生一个所有以.c、.cpp结尾的文件列表,然后存入变量SOURCES里。

<2>函数patsubst:

匹配替换,三个参数。第一个是需要匹配的样式,第二个目标样式,第三个是需要处理的由空格分离的列表。

OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))

把SOURCES文件列表中所有.cpp变成.o、.c变成.o,然后形成一个新的列表,存入OBJS变量。

<3>

%.o:%.c

$(C) $(CFLAGS) -c $< -o $@

%.o:%.cpp

$(G) $(CFLAGS) -c $< -o $@

表示把所有的.c、.cpp文件编译成.o文件。

注:这里有三个比较有用的内部变量。$@扩展成当前规则的目的文件名,$<扩展成依靠列表中的第一个依靠文件,$^扩展成整个依靠的列表(除掉里面所有重复的文件名)。

<4>

chmod a+x $(TARGET) 表示把firstTest强制变成可执行文件。

以上内容是整理出的基础用法。要深入了解Makefile,必须更加深入实践才行。

Understanding Makefile With Examples

原文链接:https://www.howtouselinux.com/post/understanding-makefile-with-examples

相关文章

  • Makefile 的使用

    在 Linux 中使用 make 命令来编译程序,特别是大程序;而 make 命令所执行的动作依赖于 Makefile 文件。最简单的 Makefile 文件如...

    韦东山
  • Makefile 使用总结

    http://www.cnblogs.com/wang_yb/p/3990952.html

    bear_fish
  • makefile基本使用

    aruba
  • 如何使用Makefile在Ubuntu上自动执行重复任务

    如果您有从Linux服务器上的源代码安装软件的经验,您可能会遇到make实用程序。该工具主要用于自动编译和构建程序。它允许应用程序的作者轻松地布置构建该特定项目...

    楠宝宝
  • Go使用Makefile构建

    Makefile 是和 make 命令一起配合使用的。它是开源的构建工具,很多大型项目的编译都是通过 Makefile 来组织的。

    程序员同行者
  • Linux makefile使用基础

    makefile就像一个Bash脚本,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程...

    xxpcb
  • 使用Makefile构建Docker

    刚开始学习docker命令的时候,很喜欢一个字一个字敲,因为这样会记住命令。后来熟悉了之后,每次想要做一些操作的时候就不得不 重复的输入以前的命令。当切换一个...

    Ryan-Miao
  • 在 Golang 开发中使用 Makefile

    使用 Golang 已经有一阵了,在 Golang 的开发过程中,我已经习惯于不断重复地手动执行 go build 和 go test 这两个命令. 不过,现...

    用户1558438
  • 快速上手和使用makefile

    想学习一样东西,最好先问个为什么要这样,这样学起来才有目标。上大学时,老师讲课总是告诉我们必须这样那样,很少讲这门课是干什么的,有什么意义,有什么用。有一次我...

    独行猫A
  • 使用 Makefile 构建指令集

    make 是一个历史悠久的构建工具,通过配置 Makefile 文件就可以很方便的使用你自己自定义的各种指令集,且与具体的编程语言无关。例如配置如下的 Make...

    凌虚
  • centos8中makefile命令的使用

    makefile文件中如出现一些相同的命令序列,可为这些相同的序列定义一个变量,不能和makefile文件中的变量重名,这里是_find-Android-pro...

    用户8965210
  • makefile 的 ifdef, ifeq 使用及辨析

    #可以用命令行传递变量 RELEASE = abc #ifdef 变量名称不能加$() ifdef RELEASE $(warning RELEAS...

    战神伽罗
  • Makefile中部分函数的使用

    commond:对var变量进行操作(一般会使用var变量,不然没意义),每次操作结果都会以空格隔开,最后返回空格隔开的列表。

    宋天伦
  • Makefile的详细介绍和使用

    参考链接1:https://seisman.github.io/how-to-write-makefile/invoke.html

    乱码三千
  • 换个角度说Makefile

    作为Linux下的C/C++开发者,没接触过makefile一定说不过去,通常构建大型的C/C++项目都离不开makefile,也许你使用的是cmake或者其他...

    编程珠玑
  • Linux下的make命令用法

    Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问...

    老白
  • 【Linux笔记】make工程管理工具(二)

    上一篇笔记分享了使用make工具编译C程序的方法(【Linux笔记】make工程管理工具(一)),但是还未分享make工具是什么,本篇笔记就来看一下make工具...

    正念君
  • Linux里Makefile是什么?它是如何工作的?

    用这个方便的工具来更有效的运行和编译你的程序 makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接—–但是不...

    砸漏
  • linux下make命令的使用方法

    Make 如何工作的 对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标。这些目标通常存放在以 “Makefile” 来命名的特殊文件中,同时文...

    用户1685462

扫码关注云+社区

领取腾讯云代金券