...

Callwoola

大雄'blog

Home 主页 Blog 博客 Tag标签 GitHub开源 about me关于我


makefile小技巧

由于 makefile 本生的细分内容比较多, 本章主要通过 makefile 配合 gcc 来简单介绍 makefile 和 gcc 的基本概念. Makefile 快速入门: Makefiles 是一个能够快速组织 ,编译代码的工具,由于功能强大已经被大多数的软件平台采用!

本教程甚至不从头开始的表面是可能的使用使, 但作为一个初学者指南使您可以快速,轻松地创建自己的小到中型项目一个makefile。

简单例子

接下来简单用这个三个文件来学习: hellomake.c, hellofunc.c, hellomake.h,

hellomake.c

#include <hellomake.h>
int main() {
  // call a function in another file
  myPrintHelloMake();

  return(0);
}

hellofunc.c:

#include <stdio.h>
#include <hellomake.h>

void myPrintHelloMake(void) {

  printf("Hello makefiles!\n");

  return;
}

hellomake.h:

/*
example include file
*/

void myPrintHelloMake(void);

如果我们要执行 main() 那么我只直接 gcc hellomake.c

hellomake.c:1:10: error: 'hellomake.h' file not found with <angled>
      include; use "quotes" instead
#include <hellomake.h>
         ^~~~~~~~~~~~~
         "hellomake.h"
1 error generated.

显然 gcc 并不知道 hellomake.h 文件在哪里

所以通常情况下,您将通过执行以下命令来编译这一集合代码:

gcc -o hellomake hellomake.c hellofunc.c -I.

例子1

当然这样打命令并没有问题, 可以随着我们的项目越来越大, 这样的方式显然不方便调试, 我们需要让工作高效一些. Makefile 高效编译工具

Makefile

hellomake: hellomake.c hellofunc.c
     gcc -o hellomake hellomake.c hellofunc.c -I.

首先我们定义制作 hellomake 这个文件需要的资料 (hellomake.c hellofunc.c)

然后在第二行定义如果加工这两个文件

Makefile 文件由一系列规则(rules)构成。每条规则的形式如下。
<target> : <prerequisites> 
[tab]  <commands>

ps 其他构建方法:

> Makefile文件也可以写为makefile
> 或者用命令行参数指定为其他文件名。

$ make -f rules.txt
or$ make --file=rules.txt
> 指定make命令依据rules.txt文件中的规则,进行构建。

有一个特别重要知识点, 就是在编译命令前必须有一个 "tab" 键空出, 不能是空格 ,只能是 "tab" 系统才能够识别!

例子 2:

当我们需要对同的编译平台时候,总不能定义不同的 Makefile 吧, 这时我们可以定义常量了


CC=gcc
CFLAGS=-I.

hellomake: hellomake.o hellofunc.o
     $(CC) -o hellomake hellomake.o hellofunc.o -I.

例子 3:

Makefile 3:

$@ 表示目标文件 $< 表示第一个依赖文件 -c 表示编译但不链接

CC=gcc
CFLAGS=-I.
DEPS = hellomake.h

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: hellomake.o hellofunc.o 
    gcc -o hellomake hellomake.o hellofunc.o -I.

可以看到这个规则 , 这里将会把 所有的 .c 文件编译成 .o 文件 并且,每个 .o 文件都会自动依赖 hellomake.h 文件

Makefile 4:

CC=gcc
CFLAGS=-I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o 

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS)

Makefile 5:

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~

参考: make快速入门 阮一峰make命令教程

  • 文档信息:
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 发表日期: 2016-09-1016:48:45+0800
  • 更多内容:
  • Feed订阅:
相关内容:

disqus评论区:

0