makefile学习

虽然已经做了几年的linux开发,但是由于makefile都是别人写好的,对此也只是简单的了解。最近想修改下一个很小的makefile文件都错误一堆,尴尬啊。再学习下。

 gcc

-c: 编译代码,但不链接。

-o:输出目标。默认a.out。

-g:debug模式。

-I:指定#include的目录

-L,-l:指定链接目录。-lXXX会在-L目录下寻找libXXX。

-Wall:显示warning信息。

 

ar

r 在文件包中代替文件.

c 无提示模式创建文件包

 

s 强制重新生成文件包的符号表

 

Makefile

makefile规则:

TARGET... : PREREQUISITES...

  COMMAND


目标:依赖

  命令(一定要以tab开头)

.
|-- Makefile
|-- a-src
|   |-- a.c
|   `-- a1.c
|-- include
|   `-- l.h
`-- l-src
    |-- l.c
    `-- l2.c

3 directories, 6 files
a-src/a.c
#include <stdio.h>
#include "l.h"

extern void print_a();

void print()
{
        print_a();
        printf("a.c\n");
}

int main()
{
        print_lib();
        print_lib2();
        print();
        return 0;
}
a-src/a1.c

#include <stdio.h>

void print_a()
{
        printf("aa\n");
}

l-src/l.c
#include <stdio.h>


void print_lib()
{
        printf("lib\n");
}
l-src/l2.c
#include <stdio.h>


void print_lib2()
{
        printf("lib2\n");
}
include/l.h
#ifndef _LIB_H
#define _LIB_H

void print_lib();
void print_lib2();
#endif

 




 

 

makefile文件

CFLAGS = -g -Wall

DIR = a-src

LIB_DIR = l-src

INCLUDE = include

SRC_A = $(wildcard $(DIR)/*.c)
OBJ_A = $(SRC_A:%.c=%.o)

SRC_L = $(wildcard $(LIB_DIR)/*.c)
OBJ_L = $(SRC_L:%.c=%.o)

LIB_TARGET = l.a

a : $(OBJ_A) $(LIB_TARGET)
        @echo "start-----"
        gcc $(CFLAGS) $^ -o $@ -I$(INCLUDE)

$(LIB_TARGET): $(OBJ_L)
        @echo "lib-------"
        @echo $(LIB_TARGET)
        @echo $(OBJ_L)
        @echo $@
        @echo $^
        @echo $<
        @echo "--------"
        ar rcs $@ $^

%.o:%.c
        gcc -c $< -I$(INCLUDE) -o $@

.PHONY :clean
clean :
        rm a $(LIB_TARGET) $(OBJ_A) $(OBJ_L) -f

 

 

posted on 2013-05-02 15:20  单刀不进  阅读(181)  评论(0编辑  收藏  举报

导航