zoukankan      html  css  js  c++  java
  • makefile实验四 编译本地的源文件 + 变量的高级主题一

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

    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 
    ");
    
            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时候的目标。

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    Codeforces Round #392 (Div. 2)
    hihocoder #1419 : 后缀数组四·重复旋律4
    hihocoder #1415 : 后缀数组三·重复旋律3
    LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
    LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
    LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)
    LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
    LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
    LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
    LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/11336743.html
Copyright © 2011-2022 走看看