object=test.o ExShell.o
all:libExShell.so test $(object)
test:test.o
g++ -o $@ $^ -L. -lExShell
.cpp.o:
g++ -c -fPIC $<
libExShell.so:ExShell.o
g++ -fPIC -shared -o $@ $^
clean:
@rm *.o test libExShell.so
这是一个项目中的makefile.很简单的一个makefile.文件有ExShell.cpp,ExShell.h,test.cpp.
生成动态链接库的一个简单makefile
第一行是变量定义
第二行是makefile中的all用法。基本相当于伪目标。后面的依次实现的文件最好从依赖最少的开始,然后再逐渐到依赖多的。
第三行是用一个动态的库来编译一个test执行程序。
第四行是将相应的.o文件用.cpp文件进行编译
第五行是将.o文件生成一个动态so文件。如果以后有多个.o的话,直接添加.o 就可以了。
clean:
也是一个伪目标。只有打 make clean才会执行。 完整的应该是.PHONY:clean.
还有makefile 的高级用法和shell命令配合使用
如果一个项目中有多个文件夹,每个文件夹下面有一个makefile ,那么你就可以在这些文件夹的上级目录中再建立一个makefile。让它依次执行每个文件夹里面的makefile.
这个makefile 的内容为:
SUBDIRS=practise transgateway
all:
for i in $(SUBDIRS);do \
echo "cd $$i...."; \
(cd $$i; $(MAKE)); done
clean:
for i in $(SUBDIRS);do \
echo "makeclean $$i..."; \
(cd $$i;$(MAKE)); done
其中$$i 比较有争议,在这里可以把它理解为在这种循环下定位到循环中的每一个变量的用法。$(MAKE)是shell中执行 make 命令。在其前面用$()来引用。是用这种形式执行shell命令的格式。