Linux下的C/C++编程通常需要生成动态库,根据Makefile的语法规定,可以编写下面较为通用的Makefile文件。
# Generate shared library
# Fetch version number
vernum := $(shell cat ../version 2> /dev/null)
# Sizing up to a growing demand
uniexe :=
my_prefix :=
my_suffix := .$(vernum)
#####################
# Parameter -m32: generate 32 bits codes
# Parameter -m64: generate 64 bits codes
# If not use this parmeter, it will generate coincident codes
# as current operater system.
#####################
libs :=
CPPFLAGS32 := -m32
LDFLAGS32 := -m32
# Fetch version number
vernum := $(shell cat ../version 2> /dev/null)
# Sizing up to a growing demand
uniexe :=
my_prefix :=
my_suffix := .$(vernum)
#####################
# Parameter -m32: generate 32 bits codes
# Parameter -m64: generate 64 bits codes
# If not use this parmeter, it will generate coincident codes
# as current operater system.
#####################
libs :=
CPPFLAGS32 := -m32
LDFLAGS32 := -m32
# Sizing up to a growing demand: predefined variables
# C pre-process parameter
CPPFLAGS :=
# Link parameter
LDFLAGS :=
CXX := gcc -Wall -ggdb $(SSCFLAGS)
CC := $(CXX)
LDFLAGS += $(LDFLAGS32)
CPPFLAGS += $(CPPFLAGS32)
EXE += $(uniexe)
lnkfile := $(EXE)
# Generate position independent code
CPPFLAGS += -fPIC
LDFLAGS += -shared
LDLIBS := $(addprefix -l, $(libs))
SOURCE := $(wildcard *.c) $(wildcard *.cpp)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
# Generate *.d files
CPPFLAGS+= -MMD
# C pre-process parameter
CPPFLAGS :=
# Link parameter
LDFLAGS :=
CXX := gcc -Wall -ggdb $(SSCFLAGS)
CC := $(CXX)
LDFLAGS += $(LDFLAGS32)
CPPFLAGS += $(CPPFLAGS32)
EXE += $(uniexe)
lnkfile := $(EXE)
# Generate position independent code
CPPFLAGS += -fPIC
LDFLAGS += -shared
LDLIBS := $(addprefix -l, $(libs))
SOURCE := $(wildcard *.c) $(wildcard *.cpp)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
# Generate *.d files
CPPFLAGS+= -MMD
#####################################
# $addprefix(<prefix>, <name...>)
# Add <prefix> to behind of <name>
# $addsuffix(<suffix>, <name...>)
# Add <suffix> to front of <name>
####################################
BINS := $(addprefix $(my_prefix), $(addsuffix $(my_suffix), $(EXE)))
.PHONY: build objs clean rebuild link
build: $(BINS) $(lnkfile)
objs: $(OBJS)
clean:
-$(RM) *.o
-$(RM) *.d
-$(RM) $(EXE)
-$(RM) $(BINS)
rebuild: clean build
# $addprefix(<prefix>, <name...>)
# Add <prefix> to behind of <name>
# $addsuffix(<suffix>, <name...>)
# Add <suffix> to front of <name>
####################################
BINS := $(addprefix $(my_prefix), $(addsuffix $(my_suffix), $(EXE)))
.PHONY: build objs clean rebuild link
build: $(BINS) $(lnkfile)
objs: $(OBJS)
clean:
-$(RM) *.o
-$(RM) *.d
-$(RM) $(EXE)
-$(RM) $(BINS)
rebuild: clean build
# For Soft-Link
$(lnkfile):
@ln -svf $(BINS) $(lnkfile)
$(BINS): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
$(lnkfile):
@ln -svf $(BINS) $(lnkfile)
$(BINS): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
在uniexe处添加要生成的动态库名即可。