make与makefile的几个例子和(自己写一下,汗!忘记了!)总结

共用的几个源代码文件:

main.c 2.c 3.c

代码依次为:

 1 #include<stdlib.h>
 2 #include "a.h"
 3 extern void function_two();
 4 extern void function_three();
 5 
 6 int main()
 7 {
 8     function_two();
 9     function_three();
10     exit (EXIT_SUCCESS);
11 }
View Code
#include "a.h"
#include "b.h"

void function_two(){}
View Code
#include "b.h"
#include "c.h"

void function_three(){}
View Code

还有三个文件:a.h b.h c.hz使用shell命令创建它们。

touch a.h b.h c.h

第一个版本的makefile

 1 all:myapp
 2 
 3 # Which compiler
 4 cc = gcc
 5 
 6 # Where are include files kept
 7 INCLUDE = .
 8 
 9 # Options for development
10 CFLAGS = -g -Wall -ansi
11 
12 myapp: main.o 2.o 3.o
13     $(cc) -o myapp main.o 2.o 3.o
14 
15 main.o: main.o a.h
16     $(cc) -I$(INCLUDE) $(CFLAGS) -c main.c 
17 
18 2.o:2.c a.h b.h
19     $(cc) -I$(INCLUDE) $(CFLAGS) -c 2.c
20 
21 3.o:3.c b.h c.h
22     $(cc) -I$(INCLUDE) $(CFLAGS) -c 3.c
View Code

第二个版本的makefile

 1 all:myapp
 2 
 3 # Which compiler
 4 cc = gcc
 5 
 6 # Where to install
 7 INSTDIR = /usr/local/bin
 8 
 9 # Where are include files kept
10 INCLUDE = .
11 
12 # Options for development
13 CFLAGS = -g -Wall -ansi
14 
15 myapp: main.o 2.o 3.o
16     $(cc) -o myapp main.o 2.o 3.o
17 
18 main.o: main.o a.h
19     $(cc) -I$(INCLUDE) $(CFLAGS) -c main.c 
20 
21 2.o:2.c a.h b.h
22     $(cc) -I$(INCLUDE) $(CFLAGS) -c 2.c
23 
24 3.o:3.c b.h c.h
25     $(cc) -I$(INCLUDE) $(CFLAGS) -c 3.c
26 
27 clean:
28     -rm main.o 2.o 3.o
29 
30 install: myapp
31     @if [-d $(INSTDIR) ]; \
32         then \
33         cp myapp $(INSTDIR); && \
34         chmod a+x $(INSTDIR)/myapp; && \
35         chmod og-w $(INSTDIR) /myapp; && \
36         echo "Installed in $(INSTDIR)";\
37     else \
38         echo "Sorry, $(INSTDIR) does not exist";\
39     fi
View Code

第三个版本的makefile

all:myapp

# Which compiler
cc = gcc

# Where to install
INSTDIR = /usr/local/bin

# Where are include files kept
INCLUDE = .

# Options for development
CFLAGS = -g -Wall -ansi

myapp: main.o 2.o 3.o
    $(cc) -o myapp main.o 2.o 3.o

main.o: main.o a.h
    $(cc) -I$(INCLUDE) $(CFLAGS) -c main.c 

2.o:2.c a.h b.h
    $(cc) -I$(INCLUDE) $(CFLAGS) -c 2.c

3.o:3.c b.h c.h
    $(cc) -I$(INCLUDE) $(CFLAGS) -c 3.c

clean:
    -rm main.o 2.o 3.o

install: myapp
    @if [-d $(INSTDIR) ]; \
        then \
        cp myapp $(INSTDIR); && \
        chmod a+x $(INSTDIR)/myapp; && \
        chmod og-w $(INSTDIR) /myapp; && \
        echo "Installed in $(INSTDIR)";\
    else \
        echo "Sorry, $(INSTDIR) does not exist";\
    fi
View Code

第四个版本的makefile

all: myapp

# Which compiler
CC = gcc

# Where to install
INSTDIR = /usr/local/bin

# Where are include files kept
INCLUDE = .

# Options for development
CFLAGS = -g -Wall -ansi

# Options for release
# CFLAGS = -O -Wall -ansi

# Local Libraries
MYLIB = mylib.a

myapp: main.o $(MYLIB)
    $(CC) -o myapp main.o $(MYLIB)


$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h

clean:
    -rm main.o 2.o 3.o $(MYLIB)

install: myapp
    @if [ -d $(INSTDIR) ]; \
    then \
        cp myapp $(INSTDIR);\
        chmod a+x $(INSTDIR)/myapp;\
        chmod og-w $(INSTDIR)/myapp;\
        echo "Installed in $(INSTDIR)";\
    else \
        echo "Sorry, $(INSTDIR) does not exist";\
    fi
View Code

 就上述例子做个总结:

  1.第一行要指定:all的对象

  2.table所在,命令所在。即所有命令均以table键开头。

  3.#键所在,注释所在。

  4.$( )所在,宏定义所在。

  5.  .  点所在,即为当前目录。

  6. -I 表示指定目录。

  7. 内置宏定义:

    $d:表示目录

makefile文件结构:

  第一点:设定all:可执行文件名

  第二点:gcc -MM 主文件名

        输出依赖关系

  第三点:然后根据依赖关系写命令

      第一.写生成可执行文件的命令,且后面根着的是目标文件。

      第二.写生成目标文件的命令即编译函数(包括主函数)文件什么,且后面根着的是源文件

posted @ 2013-11-20 22:17  Talbot3  阅读(355)  评论(0编辑  收藏  举报