23、makefile常用讲解(3)

8)objects = *.o

     通配符同样可以用在变量中。并不是说[*.o]会展开,objects的值就是“*.o”。Makefile 中的变量其实就是 C/C++中的宏。如果你要让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合,那么,你可以这样:objects := $(wildcard *.o),这种用法由关键字“wildcard”指出。

9)通过makefile编译,自动推导,如果发现当前的文件没有做过更新,则不会编译,只编译更新过了的。

附:

1、预定义变量选项

预定义变量

含义

$* 

不包含扩展名的目标文件名称。

$+ 

所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。

$< 

第一个依赖文件的名称。

$? 

所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。

$@ 

目标的完整名称。

$^ 

所有的依赖文件,以空格分开,不包含重复的依赖文件。

$% 

如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则 $@ mytarget.so,而 $% image.o

AR  

归档维护程序的名称,默认值为 ar

ARFLAGS

归档维护程序的选项。

AS 

汇编程序的名称,默认值为 as

ASFLAGS

汇编程序的选项。

CC 

C 编译器的名称,默认值为 cc

CCFLAGS 

C 编译器的选项。

CPP 

C 预编译器的名称,默认值为 $(CC) -E

CPPFLAGS

C 预编译的选项。

CXX 

C++ 编译器的名称,默认值为 g++

CXXFLAGS

C++ 编译器的选项。

2、make 选项

命令行选项

  含义

-C DIR

  在读取 makefile 之前改变到指定的目录 DIR

-f FILE

 以指定的 FILE 文件作为 makefile

-h

  显示所有的 make 选项。

-i

  忽略所有的命令执行错误。

-I DIR

  当包含其他 makefile 文件时,可利用该选项指定搜索目录。

-n

  只打印要执行的命令,但不执行这些命令。

-p

  显示 make 变量数据库和隐含规则。

-s

  在执行命令时不显示命令。

-w

  在处理 makefile 之前和之后,显示工作目录。

-W FILE

  假定文件 FILE 已经被修改。

3、示例代码

CC=gcc

CXX=g++

CFLAGS= -g -Wall

INC=./***

LIB=./***.a

CFLAGS+= -DSNACC_DEEP_COPY -DHAVE_VARIABLE_SIZED_AUTOMATIC_ARRAYS -Wno-deprecated -lpthread -lssl

TARGET=***

OBJ = **.o \

      ./**.o\

$(TARGET): $(OBJ)

        $(CXX) $(CFLAGS) -o $@ $^ $(LIB) 

#如下代码,把所有的cpp文件编译成.o文件

%.o: %.cpp

        $(CXX)  $(CFLAGS) $(INC) -c -o $@ $<

clean:

        rm -f *.o

        rm -f $(TARGET)

参考

1http://www.cnblogs.com/goodcandle/archive/2005/11/17/278702.html

2www.wenku.baidu.com

3http://www.chinaunix.net/jh/23/408225.html

4http://www.gnu.org/software/make/manual/make.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
############################################################################# # Makefile for building: sample 2011-09-26 # # Project: # Template: # Command: # ------基本上简单用法的makefile------- #1. 第一个目标为最终目标 #2. 命令以 Tab开头,可以有多个命令 #3. 分行号\ 后面不可以跟空格 #4、加@可以去掉命令显示 #5. 变量为 abc = efd 访问为 $(abc) echo $abc # # # #缺点,单文件夹 #每次都会重新生成 # #foo.o : foo.c defs.h # foo模块 #cc -c -g foo.c # #多目录 一种方法,在主目录里面include "",然后其里面OBJS += .o,这样其实就是 或用foreach ############################################################################# #target EXECUTABLE := test CC := gcc CXX := g++ STRIP := strip AR := ar cqs LINK := g++ RM := rm -f CFLAGS := -g -Wall CXXFLAGS := $(CFLAGS) CXXFLAGS += -MD LIBS := -lm LIBPATH := -L/usr/local/lib INCPATH := ####### Output directory OBJSPATH := ../Obj/ EXECUTABLEPATH := ../Execute/ #######source Files SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SOURCE))) DEPS := $(patsubst %.o,%.d,$(OBJS)) #######rule .SUFFIXES: .cpp .c .o .so .a .d $(OBJSPATH)%.o:%.c $(CC) $(CFLAGS) -c $< -o $@ $(OBJSPATH)%.o:%.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ $(OBJSPATH)%.d:%.cpp $(CXX) -MM $ $@ ######main .PHONY : all deps objs clean rebuild all: $(EXECUTABLE) $(CXX) $(CXXFLAGS) $(INCLUDEPATH) $(LIBS) $(LIBPATH) $(addprefix $(OBJSPATH),$(OBJS)) \ -o $(EXECUTABLEPATH)$(EXECUTABLE) deps: $(addprefix $(OBJSPATH),$(DEPS)) objs: $(addprefix $(OBJSPATH),$(OBJS)) clean: @$(RM) $(OBJSPATH)*.o @$(RM) $(OBJSPATH)*.d @$(RM) $(EXECUTABLEPATH)$(EXECUTABLE) rebuild: clean all -include $(addprefix $(OBJSPATH),$(DEPS)) ##.d里面是详细的.o rule 自己会括展开的,然后没有文件就自己去重建 $(EXECUTABLE) : objs

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值