<一>编译本地的源文件 + 变量的模式替换    实验代码

root@ubuntu:~/Makefile_Test/5make_test# vim makefile

target := target.out
CC := gcc
src := $(wildcard *.c) #使用maefile的预定义函数来获取本地的后缀为C的源文件
o_files := $(src:%.c=%.o) #这是(变量的高级主题之)变量的模式替换 $(o_files):$(src) #将源代码进行汇编,生成汇编文件
$(CC) -c $^ -o $@ $(target) : $(o_files) #将汇编代码进行链接
@echo $(o_files)
@echo "--------"
$(CC) $^ -o $(target)

测试:

root@ubuntu:~/Makefile_Test/5make_test# ls
func1.c makefile
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# make target.out
gcc -c func1.c -o func1.o
func1.o
--------
gcc func1.o -o target.out

root@ubuntu:~/Makefile_Test/5make_test# make 
  make: 'func1.o' is up to date.  // 这里默认直接make第一个目标,该目标是模式替换内的变量名,应该也存在本文<三>所述问题。详见<三>。

也可以像下面这样写

target := target.out
CC := gcc
src := $(wildcard *.c) $(target) : $(src)
$(CC) $^ -o $(target)

测试:

root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# cat func2.c
#include <stdio.h> int main(void)
{
printf("hello world \n"); return 0;
}
root@ubuntu:~/Makefile_Test/5make_test# ls
func2.c makefile target.out
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# make
gcc func2.c -o target.out
root@ubuntu:~/Makefile_Test/5make_test# make
make: 'target.out' is up to date.

<二>变量的值的替换  实验

root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# cat makefile2
src := a.cc b.cc c.cc
obj := $(src:cc=o) #注意,这里不要有空格 test :
@echo "obj => $(obj)" root@ubuntu:~/Makefile_Test/5make_test#

root@ubuntu:~/Makefile_Test/5make_test# make -f makefile2 test
  obj => a.o b.o c.o
  root@ubuntu:~/Makefile_Test/5make_test#

<三>规则中的模式替换 实验

.PHONY : all
cc := gcc
objs := func.o main.o $(objs) : %.o : %.c #这里的objs是变量名,同时也作为最终make时候的目标名。实测,不可行。
$(cc) -o $@ -c $^

#规则替换,等效于下面的几句

#func.o : func.c
 # gcc -c $^ -o $@
 #main.o : main.c
 # gcc -c $^ -o $@

测试

root@ubuntu:~/Makefile_Test/5make_test# make
gcc -o func.o -c func.c // 死活,只能打印一句func.c相关的, 但是main.c(每次实验都已保证该文件是最新的) main.o一直不能打印出来
root@ubuntu:~/Makefile_Test/5make_test#

最终的解决方法:

.PHONY : all
cc := gcc
objs := func.o main.o $(objs) : %.o : %.c
$(cc) -o $@ -c $^

#在原基础上,增加了下述代码
all : $(objs) # 不把objs变量直接作为最终的目标,而是作为依赖来使用
@echo "OK"

#规则替换,等效于下面的几句

#func.o : func.c
  # gcc -c $^ -o $@
  #main.o : main.c
  # gcc -c $^ -o $@

测试

root@ubuntu:~/Makefile_Test/5make_test# ls
func.c main.c makefile makefile2
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# make all
gcc -o func.o -c func.c
gcc -o main.o -c main.c
OK
root@ubuntu:~/Makefile_Test/5make_test#
root@ubuntu:~/Makefile_Test/5make_test# ls
func.c func.o main.c main.o makefile makefile2

小结:不要将规则中的模式替换代码内的目标,直接作为最终make时候的目标。

最新文章

  1. 设置secureCRT的鼠标右键为弹出文本操作菜单功能
  2. Swift-ImageView响应点击事件
  3. Xcode 设置代码不自动换行
  4. hihoCoder #1033 : 交错和 (数位Dp)
  5. win32 api ShouCursor 根据内部计数器 是否&gt;= 0 决定是否 显示光标,每true时计数器+1,每false-1
  6. RFC822DateGMT
  7. s15day12作业:MySQL练习题参考答案
  8. BFS+状态压缩 HDU1429
  9. php中页面跳转部分方法论述
  10. document.all使用
  11. 【转】在iOS开发中使用FMDB
  12. 开涛spring3(9.2) - Spring的事务 之 9.2 数据库事务概述
  13. Spring Boot初探之restful服务发布
  14. 当代前端应该怎么写这个hello world?
  15. 国际空间站直播 ISS直播
  16. k8s调度的亲和性和反亲和性
  17. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
  18. Linux安装face_recgnition
  19. 微信小程序——1、文件的认识
  20. 9、Android---UI---Material Design

热门文章

  1. Git使用感悟
  2. Python Selenium 之数据驱动测试的实现
  3. Linux下Vim常用操作
  4. Fitness - 05.22
  5. Tomact的中文乱码设置
  6. 十分钟快速入门 Python
  7. JS基础回顾_Dom
  8. Oracle数据库之表与表数据操作
  9. Eclipse安装Mat工具分析教程
  10. algorithm入门算法中的常见问题