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