四、Makefile包含 头文件和库文件

一、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
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在编译过程中,我们经常需要包含其他的头文件。如果头文件不在默认的搜索路径下,我们可以通过在Makefile中添加头文件的路径来解决这个问题。例如,如果头文件test.h位于/usr/include目录下,我们可以在Makefile中添加以下行来指定头文件的路径: INC_CLUDE = -I/usr/include 然后,在编译规则中使用$(INC_CLUDE)来包含头文件。例如,对于test1.c,我们可以使用以下规则: test1.o: test1.c $(GCC) -c $< -o $@ $(INC_CLUDE) 这样,编译器就能够找到并包含test.h头文件了。\[1\] 另外,在链接过程中,我们经常需要链接一些文件。如果文件不在默认的搜索路径下,我们可以通过在Makefile中添加文件的路径来解决这个问题。例如,如果文件libf1.so、libf2.so和libf3.so位于/usr/lib目录下,我们可以在Makefile中添加以下行来指定文件的路径: lib_PATH = -L/usr/lib/ -lf1 -lf2 -lf3 然后,在链接规则中使用$(lib_PATH)来链接文件。例如,对于目标文件test1,我们可以使用以下规则: test1: test1.o $(GCC) -o $@ $< $(lib_PATH) 这样,链接器就能够找到并链接所需的文件了。\[2\] 如果我们想将这个案例分享给别人使用,但是别人的文件头文件可能不在相同的路径下,我们可以在当前目录下创建一个include目录和一个lib目录,并将需要的头文件文件复制到相应的目录中。然后,在Makefile中将路径配置为当前目录。例如,我们可以使用以下行来指定头文件文件的路径: INCLUDE = -I./include LIB_PATH = -L./lib -lf1 -lf2 -lf3 这样,无论给谁,他们都可以直接编译,而不需要进行额外的配置操作。\[3\] #### 引用[.reference_title] - *1* *2* *3* [Makefile包含 头文件文件](https://blog.csdn.net/zzsxyl/article/details/109625653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值