非万能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 2013-01-21 16:06  jogger  阅读(237)  评论(0编辑  收藏  举报

导航