码迷,mamicode.com
首页 > 其他好文 > 详细

GNU Make 快速教程

时间:2017-12-20 13:35:28      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:target   class   mode   tps   pos   官方   nothing   oid   dir   

 

假设有如下程序:

hellomake.c hellofunc.c hellomake.h
#include "hellomake.h"

int main() {
  // call a function in another file
  myPrintHelloMake();

  return(0);
}
#include <stdio.h>
#include "hellomake.h"

void myPrintHelloMake(void) {

  printf("Hello makefiles!\n");

  return;
}

/* example include file */

void myPrintHelloMake(void);

 

 

 

 

 

 

 

 

 

使用命令行编译

gcc -o hellomake hellomake.c hellofunc.c

 

 

缺点:

1. 如果有更多的文件,gcc命令复杂

2. 如果只改动某个文件,所有文件都需要重新编译

 

Makefile 版本1

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

 

Makefile 文件中包含一组用编译应用程序的规则,make 看到的第一项规则叫默认规则。

规则由三部分组成: target, prerequiste, command.

target: prereq1 prereq2

  commands

 

缺点:

* 所有代码文件都在同一目录中

 

 

Makefile 版本2

CC=gcc
CFLAGS=-I.

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

 

 

Makefile 版本3

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.

 

 

Makefile 版本5

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 版本6

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)/*~ 

 

使用工作区

all

install

clean

disclean

TAGS

info

check

 

在BSD与Linux平台通用的makefile

编译 make

Debug  make DEBUG=1

BSD  gmake BSD=1

# Makefile for utelnetd
# 
# Configure this with the following environment variables:
#

# where to install
INSTDIR        := /usr/local/bin/

# GNU target string 
CROSS        :=

# where to find login program
ifneq ("", "$(BSD)")
LOGIN        := /usr/bin/login
else
LOGIN        := /bin/login
endif

ifneq ("", "$(BSD)")
CORE        := utelnetd.core
else
CORE        := core
endif

# nothing to configure below this line... ---8<---8<---8<---

PROGS     = utelnetd

INSTMODE  = 0755
INSTOWNER = root
INSTGROUP = root

OBJS      = utelnetd.o

CC        = $(CROSS)gcc
INSTALL   = install

CFLAGS     += -I. -pipe -DSHELLPATH=\"$(LOGIN)\" -Wall

ifneq ("","$(DEBUG)")
CFLAGS   += -DDEBUG -g -Os
STRIP      = \#
else
CFLAGS     += -fomit-frame-pointer
STRIP      = $(CROSS)strip 
endif

ifeq ("1", "$(BSD)")
CFLAGS   += -DBSD
endif


all: $(PROGS)

$(PROGS): $(OBJS)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
    $(STRIP) --remove-section=.comment --remove-section=.note $@

.PHONY: install
install: $(PROGS)
    $(INSTALL) -d $(INSTDIR)
    $(INSTALL) -m $(INSTMODE) -o $(INSTOWNER) -g $(INSTGROUP) $(PROGS) $(INSTDIR)

.PHONY: clean
clean:
    rm -f $(PROGS) *.o $(CORE)

 

 

 

 

 

 

 

 

 

 

 

 

 

GNU make 官方文档 https://www.gnu.org/software/make/manual/make.html

 

GNU Make 快速教程

标签:target   class   mode   tps   pos   官方   nothing   oid   dir   

原文地址:http://www.cnblogs.com/elewei/p/8064881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!