当前位置: 技术问答>linux和unix
关于编写makefile的问题
来源: 互联网 发布时间:2016-10-10
本文导语: 前提:目录A下面有三个子目录,分别为B,C,D,且这三个子目录下有各自的源程序,(源程序的种类可能为C/CC/CPP) 要求:在该目录下编写makefile,自动搜索B和C目录下的源程序,编译(且编译时输出编译信息,即使用echo语...
前提:目录A下面有三个子目录,分别为B,C,D,且这三个子目录下有各自的源程序,(源程序的种类可能为C/CC/CPP)
要求:在该目录下编写makefile,自动搜索B和C目录下的源程序,编译(且编译时输出编译信息,即使用echo语句),并生成动态库。
问题:
(1) 已解决问题:在该目录下编写makefile,自动搜索B和C目录下的源程序,编译————(在本目录下生成相应的.o文件),并生成动态库。 缺点:各子目录下不允许有同名源程序
(2)未解决问题:在该目录下编写makefile,自动搜索B和C目录下的源程序,编译————(在相应子目录下生成相应的.o文件),并生成动态库。 优点:各子目录下运行有同名源程序。
我的问题就是想请教各位,我如何实现上面为解决的问题:
即使用变量表示要编译的子目录时,用何种语句实现转至该目录,自动识别源程序,编译源程序,并生成动态库。
下面是我写的关于(1)的makefile,并且已经验证过,可以正常编译。
PROGRAM:=test
## The library and the link options ( C and C++ common).
LIBPATH:=../bin/release_bin
INCLUDE:=-I../include
DIRS:=B C
SRCS:=$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c))
$(foreach dir,$(DIRS),$(wildcard $(dir)/*.cc))
$(foreach dir,$(DIRS),$(wildcard $(dir)/*.cpp))
OBJS:=$(addsuffix .o, $(basename $(notdir $(SRCS))))
CFLAGS:= -Wall -fPIC
LIBOBJ:=lib$(addsuffix .so,$(PROGRAM))
.PHONY:all lib exe clean
all: lib
$(OBJS):$(SRCS)
for file in $(SRCS);do
echo "$(CC) -c $(CFLAGS) $(INCLUDE) $$file";
$(CC) -c $(CFLAGS) $(INCLUDE) $$file ;
done
lib: $(OBJS)
$(CC) -shared -fPIC -o $(LIBOBJ) $^
mv $(LIBOBJ) $(LIBPATH)
clean:
$(RM) *.o
要求:在该目录下编写makefile,自动搜索B和C目录下的源程序,编译(且编译时输出编译信息,即使用echo语句),并生成动态库。
问题:
(1) 已解决问题:在该目录下编写makefile,自动搜索B和C目录下的源程序,编译————(在本目录下生成相应的.o文件),并生成动态库。 缺点:各子目录下不允许有同名源程序
(2)未解决问题:在该目录下编写makefile,自动搜索B和C目录下的源程序,编译————(在相应子目录下生成相应的.o文件),并生成动态库。 优点:各子目录下运行有同名源程序。
我的问题就是想请教各位,我如何实现上面为解决的问题:
即使用变量表示要编译的子目录时,用何种语句实现转至该目录,自动识别源程序,编译源程序,并生成动态库。
下面是我写的关于(1)的makefile,并且已经验证过,可以正常编译。
PROGRAM:=test
## The library and the link options ( C and C++ common).
LIBPATH:=../bin/release_bin
INCLUDE:=-I../include
DIRS:=B C
SRCS:=$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c))
$(foreach dir,$(DIRS),$(wildcard $(dir)/*.cc))
$(foreach dir,$(DIRS),$(wildcard $(dir)/*.cpp))
OBJS:=$(addsuffix .o, $(basename $(notdir $(SRCS))))
CFLAGS:= -Wall -fPIC
LIBOBJ:=lib$(addsuffix .so,$(PROGRAM))
.PHONY:all lib exe clean
all: lib
$(OBJS):$(SRCS)
for file in $(SRCS);do
echo "$(CC) -c $(CFLAGS) $(INCLUDE) $$file";
$(CC) -c $(CFLAGS) $(INCLUDE) $$file ;
done
lib: $(OBJS)
$(CC) -shared -fPIC -o $(LIBOBJ) $^
mv $(LIBOBJ) $(LIBPATH)
clean:
$(RM) *.o
|
太麻烦了,准不准一步生成?
也不需要echo吧,默认会显示编译命令,除非你想隐藏
也不需要echo吧,默认会显示编译命令,除非你想隐藏
CC = g++
CCFLAGS = -Wall
LIBS =
DIRS = A B
SRCS = $(foreach dir,$(DIRS),$(wildcard $(dir)/*.c $(dir)/*.cpp $(dir)/*.cc))
TARGET = libfoo.so
$(TARGET): $(SRCS)
$(CC) $(CCFLAGS) -shared $(SRCS) -o $(TARGET) $(LIBS)
|
看看 老徐《makefile中文手册》,makefile的高级用法都清楚了。
|
在B/C目录下编写各自的makefile
用一个shell统一调度一下,如何..
用一个shell统一调度一下,如何..