makefile 嵌套

 

目录结构:

 

dynamic 和 static 两个目录实现加法功能, 分别生成动态库和静态库,   main.c 主文件链接加法功能,  终端命令执行:   make dynamic=1  则编译动态库进行链接 ,   make 静态库编译

动态库的makefile内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# CROSS_COMPILE :=
# CC := $(CROSS_COMPILE)gcc
# CPP := $(CROSS_COMPILE)g++
 
TARGET := libadd.so
OBJ := sub.o
SRCS = $(wildcard *.c)
 
all:
    $(CC) -c -o $(OBJ) -fPIC $(SRCS)
    $(CC) -shared -fPIC -o $(TARGET)  $(OBJ)
 
 
.PHONY : clean
clean:
    rm $(OBJ) $(TARGET) -f

 静态库makefile内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# CROSS_COMPILE :=
# CC := $(CROSS_COMPILE)gcc
# CPP := $(CROSS_COMPILE)g++
# AR := $(CROSS_COMPILE)ar
 
TARGET := libadd.a
OBJ := sub.o
SRCS = $(wildcard *.c)
 
all:
    $(CC) -c -o $(OBJ)  $(SRCS)
    $(AR) -rcs -o $(TARGET)  $(OBJ)
 
 
.PHONY : clean
clean:
    rm $(OBJ) $(TARGET) -f

  

根目录的makefile内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
CROSS_COMPILE :=
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)AR
CPP = $(CROSS_COMPILE)g++
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMILE)nm
 
STRIP = $(CROSS_COMPILE)strip
OBJDUMP = $(CROSS_COMPILE)objdump
OBJCOPY = $(CROSS_COMPILE)objcopy
 
 
 
ifndef dynamic
LIBPATH := static
else
LIBPATH := dynamic
endif
 
 
CFLAGS := -Wall -O2 -g
CFLAGS += -I $(shell pwd)/$(LIBPATH)
 
LDFLAGS := -lm -L$(LIBPATH) -ladd
 
 
TOPDIR := $(shell pwd)
 
SRCS = $(wildcard *.c)
 
 
TARGET := main
OBJ := main.o
 
all:$(TARGET)
# $(TARGET):    这种方式不会自动推导调用 %.o:%.c 这个内容
$(TARGET):$(OBJ)
    make -C $(LIBPATH)
    $(CC) $(OBJ) $(CFLAGS) $(LDFLAGS) -o $(TARGET)
#  这样放会出现找不到链接库的问题,源文件要放在链接库前面
# $(CC)  $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(SRCS) 
 
%.o:%.c
    $(CC) -c $(CFLAGS)  $^ -o $@
 
 
 
# .PHONY是一个伪目标,可以防止在Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突
.PHONY : clean
clean:
    make -C $(LIBPATH) clean
    rm $(OBJ) $(TARGET) -f

  

 源码下载路径: https://download.csdn.net/download/aba13579/10777167

 

参考链接: https://blog.csdn.net/qq_21792169/article/details/50448639

posted @   cogitoergosum  阅读(558)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2017-11-10 modbus 寄存器介绍
点击右上角即可分享
微信分享提示