一、Makefile规则
二、Makefile案例-多个文件生成一个目标文件
三、Makefile–生成多个目标文件
四、Makefile包含 头文件和库文件
此篇文章以三、Makefile–生成多个目标文件为例
包含头文件
我们在编译的时候 ,经常会遇到要包含一些其他的头文件,比如在编译test1.c test2.c test3.c 的时候 ,我们需要用到 test.h,但是这个头文件在/usr/include 目录下,直接 #include “test.h” 或者#include<test.h>
编译的时候 会报错 ,找不到该头文件
我们只要在Makefile 里面添加 头文件的路径即可
INC_CLUDE = -I/usr/include
%.o:%.c
$(GCC) -c $< -o $@ $(INCLUDE)
包含库文件
在链接的时候,我们经常会链接一些库文件进去,因为 在c文件里面 调用了一些 库文件里面的函数,所以需要连接进去,不然 找不该该函数
比如我们要使用 libf1.so libf2.so libf3.so文件,他们都在 /usr/lib目录下
我们只要在编译规则的后面添加 库文件的路径即可
lib_PATH = -L/usr/lib/ -lf1 -lf2 -lf3
.PHONY:all
all: $(TARGET1) $(TARGET2) $(TARGET3)
$(TARGET1): $(TARGET).o
$(GCC) -o $< $@ $(lib_PATH)
全部打包到当前目录下
有时候 我们想把这个案例给别人使用,但是别人的 库文件和 头文件 不一定跟你的 在同一个路径下,如果直接使用库文件的路径,那不给到别人手上 ,不又得重新配置一下
所以最好的方式就是 在当前目录下创建一个include 目录 和 一个lib目录,如果文件 很多,也可以在include 下 和 lib下建立子目录 分类 不同类型的 头文件和 库文件 把需要的头文件 和 库文件 复制过来,这样在makefile里面配置为当前 目录,这样的话,我们无论给谁,他们都可以直接编译,不用做过多的操作。
我们把 test.h 文件 放到当前目录的include 目录下
libf1.so libf2.so libf3.so 放到当前目录的lib目录下
一个完整的makefile如下
INCLUDE = -I./include
LIB_PATH = -L./lib -lf1 -lf2 -lf3
TARGET1 = test1
TARGET2 = test2
TARGET3 = test3
.PHONY: all
all: $(TARGET1) $(TARGET2) $(TARGET3)
$(TARGET1) : $(TARGET1).o
$(GCC) -o $@ $< $(LIB_PATH)
$(TARGET2) : $(TARGET2).o
$(GCC) -o $@ $< $(LIB_PATH)
$(TARGET3) : $(TARGET3).o
$(GCC) -o $@ $< $(LIB_PATH)
#build object
%.o : %.c
$(GCC) -c $< -o $(INC_CLUDE)
.PHONY: clean
clean:
-@rm -f $(TARGET1) $(TARGET1).o
-@rm -f $(TARGET2) $(TARGET2).o
-@rm -f $(TARGET3) $(TARGET3).o