注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

阿英讲makefile的编写和使用--详细版  

2015-10-31 15:04:52|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
即以此功德,庄严佛净土。上报四重恩,下济三途苦。惟愿见闻者,悉发菩提心。在世富贵全,往生极乐国。
1 缘起: 由于任务需要,需要在linux下用c语言开发产品,详细研究下makefile的编写。查阅了许多资料,汇总下,其中用的的源文件见之前的一篇文章,见引用文件。分享出来,希望对大家有帮助!

2 引用文件:http://anony3721.blog.163.com/blog/static/511974201210712639978/

3 专用makefile

# 生成test可执行文件,它的依赖于main.o func.o,也就是说生成test你得先生成它们
CC = gcc

test: main.o func.o       
# 表示编译生成test.exe
echo $@
gcc -o test main.o func.o       

# 依赖项func.o的生成规则
func.o: func.c    

gcc -c func.c 
# 依赖项main.o的生成规则
main.o: main.c       

gcc -c main.c



# helloworld is a binary file
helloworld: func1.o main1.o
@echo $@
$(CC) -o $@ $^

func1.o: func.c
$(CC) -c -o $@ $^

main1.o: main.c
$(CC) -c -o $@ $^


#  .PHONY: clean 是指定clean为伪目标,即clean是一个假的target,make命令不会生成这个文件。 对于标签这种特性,就是“伪目标”
.PHONY: all clean

all:  test
@echo $@    # @后的命令将不显示命令本身

clean:
-rm -f *.o
-rm -f *.exe

# make clean
# make all
# make helloworld
# make test

4  通用makefile

# 使用方法: make default 或 make all

TARGET = ayingProg
LIBS = m       # LIBS = -lm  对应 libm.a
CC = gcc
CFLAGS = -g -Wall

#  .PHONY: clean 是指定clean为伪目标,即clean是一个假的target,make命令不会生成这个文件。 对于标签这种特性,就是“伪目标”
.PHONY: default all clean

default: $(TARGET)
all: default   # 如果make all 将执行该依赖关系

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

%.o: %.c $(HEADERS) # prerequisites, %.o:%c 表示"所有的.o文件"依赖于"所有的.c文件"
$(CC) $(CFLAGS) -c $< -o $@ # command, $< 第一个依赖文件, 此处是 %.c 

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
$(CC) -o $@ $(OBJECTS)  $(addprefix -l, $(LIBS))      # $(CC) $(OBJECTS) $(LIBS) -o $@ 中LIBS 需要加 -l

# make clean 执行下面的部分
clean:
-rm -f *.o
-rm -f $(TARGET)    # Linux, chmod 777 test 将文件test的权限全开
-rm -f $(addsuffix .exe, $(TARGET))   # windows

# --------- tips ------------------
# makefile 的结构总览
# target ... : prerequisites ...  # prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行
#            command     # command也就是make需要执行的命令。(任意的Shell命令)

# 1) makefile的续行符为\
# 2) $@ 表示当前节的 target
# 3)  $^ 表示所有 依赖关系
# 4) 依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件
# 5) 编好自己的Makefile 之后,可以在终端中运行 make –n  target命令查看自己所写的Makefile 文件会执行哪些命令,这可以用来判断我们的Makefile是否正确
# 6) %为Makefile规则通配符
# 7) $< 表示第一个依赖文件
# 8) OBJ = $(patsubst %.o %.c $(SRC))  patsubst是patten substitude的缩写,匹配替代的意思。这句是在SRC中找到所有.c 结尾的文件,然后把所有的.c换成.o。
# 9) $(addprefix src/,foo bar)返回值是“src/foo src/bar”
# 10) “.SECONDARY”的依赖文件被作为中间过程文件对待。但这些文件不会被自动删除。
# 11) “.PRECIOUS”的所有依赖文件在make过程中会被特殊处理:当命令在执行过程中被中断时,make不会删除它们。而且如果目标的依赖文件是中间过程文件,同样这些文件不会被删除。

# 有用的GCC 编译选项
#-llibrary 
#进行链接时搜索名为library的库。 
#例子: $ gcc test.c -lm -o test

#-Idir 
#把dir 加入到搜索头文件的路径列表中。 
#例子: $ gcc test.c -I../inc -o test

#-Ldir 
#把dir 加入到搜索库文件的路径列表中。 
#例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test


# 大多数的C/C++编译器都支持一个“-M”的选项,即自动找寻源文件中包含的头文件,并生成一个依赖关系
# 如果你使用GNU的C/C++编译器,你得用“-MM”参数,不然,“-M”参数会把一些标准库的头文件也包含进来。
# gcc -M main.c gcc -MM main.c

  评论这张
 
阅读(245)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016