非万能Makefile的万能版本
此Makefile用来生成共享库,一个前辈写的,像他本人表示感谢。
PREFIX=/usr/local #指定生成库的安装位置,当然只是程序员开发机上的位置。指定后 make install可以将库安装,app使用的时候可以指定该路径下的库文件,就能使用该库
BIN=libmy.so #生成的库文件名
LIBPATH=$(PREFIX)/lib #指定共享库的路径
MY_CFLAGS=-I../include #头文件路径
LIBS:= #可扩展lib,比如要添加glib,可以把glib路径加到这里,例如:-L../glibpath/lib -lglib
INCLUDE=$(MY_CFLAGS) #可扩展头文件,例如glib头文件,追加:-I../glibpath/include/
CFLAGS:=-g -Wall -O3 $(INCLUDE) #标志及头文件
LDFLAGS= -Wl,-R$(LIBPATH) #依赖库的路径
INSTALL=/usr/bin/install -c #指定用来安装生成库的——程序
CC=gcc #没啥好说的
MAJOR=1 #版本
MINOR=10000
SOURCE=$(wildcard *.c) #源文件,此处匹配所有c文件
OBJS:=$(patsubst %.c, %.o, $(SOURCE)) #中间件
DEPS:=$(patsubst %.o, %.d, $(OBJS)) # 依赖项
CPPFLAGS += -MMD #c++选项
.PHONY: all deps objs clean #伪目标
all: $(BIN)
deps: $(DEPS)
objs: $(OJBS)
-include $(DEPS)
$(BIN): $(OBJS)
$(CC) $(LDFLAGS) -shared -fPIC -Wl,-soname,$(@).$(MAJOR) -o $(@).$(MAJOR).$(MINOR) $(OBJS) $(LIBS)
/sbin/ldconfig -n .
if test ! -f $(@);then ln -s $(@).$(MAJOR) $(@);fi
$(RM) $(DEPS)
splint:
splint $(INCLUDE) $(SOURCE)
clean:
@$(RM) $(OBJS) $(DEPS) $(BIN)
@$(RM) $(BIN).$(MAJOR) $(BIN).$(MAJOR).$(MINOR)
install: #生成库以后,我们自己将库make install到指定的路径。
if test ! -d $(PREFIX)/lib;then mkdir -p $(PREFIX)/lib;fi
$(INSTALL) $(BIN).$(MAJOR).$(MINOR) $(PREFIX)/lib
/sbin/ldconfig -n $(PREFIX)/lib
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述