1、工程目录如下
/root/myproject/
|-- Makefile
|-- bin
|-- include
|-- lib
|-- libtest
| `-- src
| |-- Makefile
| |-- libtest.cpp
| `-- libtest.h
`-- test
|-- include
| `-- test.h
`-- src
|-- Makefile
`-- test.cpp
2、编写Makefile
1)myproject下的 Makefile
PROJECT_ROOT_PATH = /root/myproject
MFLAGS = "CFLAGS=-w"
DFLAGS = "CFLAGS=-w -g -fPIC -DDEBUG -DREENTRANT"
all :
cd $(PROJECT_ROOT_PATH)/libtest/src && $(MAKE) $(DFLAGS) TARGET_SO=1 && $(MAKE) install TARGET_SO=1
cd $(PROJECT_ROOT_PATH)/test/src && $(MAKE) $(DFLAGS) && $(MAKE) install
clean :
cd $(PROJECT_ROOT_PATH)/libtest/src && $(MAKE) clean TARGET_SO=1
cd $(PROJECT_ROOT_PATH)/test/src && $(MAKE) clean
2)libtest/src下的 Makefile
LIB_NAME = libtest
PROJECT_ROOT_PATH = /root/myproject
ifdef TARGET_SO
TARGET = $(LIB_NAME).so
endif
ifdef TARGET_AR
TARGET = $(LIB_NAME).a
endif
CXXSRCS = $(wildcard *.cpp)
CXXOBJS = $(patsubst %.cpp,%.o, $(CXXSRCS))
CXX = g++
AR = ar
ARFLAGS = -rv
SOFLAGS = -fPIC -shared
INCPATH = -I.
LDFLAGS = -L.
LIBS =
ifdef TARGET_SO
$(TARGET): $(CXXOBJS)
$(CXX) $(SOFLAGS) $^ -o $@ $(LDFLAGS) $(LIBS)
endif
ifdef TARGET_AR
$(TARGET):$(CXXOBJS)
$(AR) $(ARFLAGS) $@ $^
endif
$(CXXOBJS): %.o: %.cpp
$(CXX) $(INCPATH) $(CFLAGS) -c $< -o $@
.PHONY: install
install:
cp $(TARGET) $(PROJECT_ROOT_PATH)/lib
mkdir -p $(PROJECT_ROOT_PATH)/include/$(LIB_NAME)
cp *.h $(PROJECT_ROOT_PATH)/include/$(LIB_NAME)
.PHONY: clean
clean:
-rm -rf $(CXXOBJS)
-rm -rf $(TARGET)
-rm -rf $(PROJECT_ROOT_PATH)/include/$(LIB_NAME)
-rm -rf $(PROJECT_ROOT_PATH)/lib/$(TARGET)
3) test/src下的Makefile
EXE_NAME = test
PROJECT_ROOT_PATH = /root/myproject
CXXSRCS = $(wildcard *.cpp)
CXXOBJS = $(patsubst %.cpp,%.o, $(CXXSRCS))
CXX = g++
INCPATH = -I../include -I$(PROJECT_ROOT_PATH)/include
LDFLAGS = -L$(PROJECT_ROOT_PATH)/lib
LIBS = -ltest
$(EXE_NAME): $(CXXOBJS)
$(CXX) $^ -o $@ $(LDFLAGS) $(LIBS)
$(CXXOBJS): %.o: %.cpp
$(CXX) $(INCPATH) $(CFLAGS) -c $< -o $@
.PHONY: install
install:
cp $(EXE_NAME) $(PROJECT_ROOT_PATH)/bin
.PHONY: clean
clean:
-rm -rf $(CXXOBJS)
-rm -rf $(EXE_NAME)
-rm -rf $(PROJECT_ROOT_PATH)/bin/$(EXE_NAME)
3、构建工程
在/root/myproject下执行
make all
make clean