非万能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

 

 

posted on   jogger  阅读(242)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
< 2013年1月 >
30 31 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 1 2
3 4 5 6 7 8 9

导航

统计

点击右上角即可分享
微信分享提示