您的位置:首页 > 其它

简单的、智能搜索源文件的 Makefile(随意扩展bin或lib)

2012-06-16 20:21 253 查看
上一期:
《简单的、智能搜索源文件的 Makefile》

下载代码:http://download.csdn.net/detail/wxqee/4377256

包括《简单的、智能搜索源文件的 Makefile》和本期《简单的、智能搜索源文件的 Makefile(随意扩展bin或lib)》的代码。

过了一天,过来写一个模版,其预期的场景是这样的:

同一个工程下,需要编译一个名为AppDemo的可执行文件,它依赖本工程下的另外一个叫helloworld的动态库。

另外,AppDemo和helloworld库的源码分别保存在各自的目录中。

这个时候应该怎么做呢,看看模版的布局:

xiwang@ubuntu:~/Dev/AppDemo$ tree

.
|-- App <-- 存放AppDemo源码的目录
| |--
Makefile
| `-- main.cpp
|-- HelloLib <-- 存放helloworld库源码的目录
| |-- HelloWorld.cpp
| |-- HelloWorld.h
| `--
Makefile
|--
Makefile
|--
build_bin.mk
`--
build_lib.mk
2 directories, 8 files

其中根目录下的 Makefile 是控制编译哪些子项目的, build_bin.mk, build_lib.mk 是编译bin或lib的模版,这样在子项目中就可以简单的设定一些NAME、CXXFLAGS等就可以编译当前子项目的源文件了。当然,子项目之间的依赖(谁编译谁,后编译谁)是在根目录里表现的,没有对此优化。

文件:Makefile

# Makefile, 2012-06-15 T1738

.PHONY: all clean

all: 
	make -C HelloLib
	make -C App

clean:
	make clean -C HelloLib
	make clean -C App

文件:build_bin.mk

# build_bin.mk, 2012-06-16 T1928

# Folders
SRC_DIR     = .

BIN         = $(NAME)
OBJS        = $(patsubst %.cpp,%.o,$(wildcard $(SRC_DIR)/*.cpp))

.PHONY: all clean

all: $(BIN)

$(BIN): $(OBJS)
	$(CXX) $(CPPFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS)

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@

clean:
	$(RM) $(OBJS) $(BIN)

文件:App/Makefile

# Makefile, 2012-06-16 T1932

#
# This's a demo makefile using model build_bin.mk to build app, with source
# source code in this folder.
# 

# Require ../build_bin.mk

NAME        = AppDemo
VERSION     = 1.0.0
RELEASE     = 01

# Flags
CXXFLAGS    = -Wall
CXXFLAGS   += -I. -I$(HELLODIR)

CPPFLAGS    = -D_DEBUG

LDFLAGS     = -L. -L$(HELLODIR)  #<! set folder of helloworld library

LIBS        = -lhelloworld   #<! load library helloworld

# Folders
HELLODIR    = ../HelloLib
# END ----------------------------------

include ../build_bin.mk

文件:build_lib.mk

# build_lib.mk, 2012-06-16 T1928

# Folders
SRC_DIR     = .

BIN         = lib$(NAME).so
OBJS        = $(patsubst %.cpp,%.o,$(wildcard $(SRC_DIR)/*.cpp))

CXXFLAGS   += -fPIC

.PHONY: all clean

all: $(BIN)

$(BIN): $(OBJS)
	$(CXX) $(CPPFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS) -shared

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $^ -o $@

clean:
	$(RM) $(OBJS) $(BIN)

文件:HelloLib/Makefile

# Makefile, 2012-06-16 T1932

#
# This's a demo makefile using model build_bin.mk to build app, with source
# source code in this folder.
# 

# Require ../build_bin.mk

NAME        = AppDemo
VERSION     = 1.0.0
RELEASE     = 01

# Flags
CXXFLAGS    = -Wall
CXXFLAGS   += -I. -I$(HELLODIR)

CPPFLAGS    = -D_DEBUG

LDFLAGS     = -L. -L$(HELLODIR)  #<! set folder of helloworld library

LIBS        = -lhelloworld   #<! load library helloworld

# Folders
HELLODIR    = ../HelloLib
# END ----------------------------------

include ../build_bin.mk
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: