zoukankan      html  css  js  c++  java
  • make 写法练习

    cc=g++

    all:signal

    %:%.o
    $(cc) -o $< $@

    %.cpp:%.o
    echo se $< $@ $* $^
    g++ -c $< $@
    cl:
    rm -rf *.o signal
    [root@localhost signal]#

    下面来一个完整版的 

    有一个cpp源文件 跟makefile在同一目录  有一个头文件在子目录 subPath

    源文件为一个简单的输出 hello

    makefile如下

    cc=g++
    obj=signal.o
    VPATH=./subPath
    all:signal
    %:%.o
    echo fi
    $(cc) $< -o $@
    $(obj):%.o:%.cpp
    echo se $< $@ $* $^
    $(cc) -c -I./subPath $<
    cl:
    rm -rf *.o signal
    [root@localhost signal]#

     主要说明如下:很多时候其实是对的 不仔细目标中:左边是目标 右边依赖 不要搞错了 搞错了有时却可以是因为 系统默认会推出编译命令而不是你给出的命令

    这一点在执行make后输出可看,可用用echo输出看一下调到自己的命令没

    还可以去掉指定

    ~
    [root@localhost signal]# cat makefile
    cc=g++
    VPATH=./subPath
    all:signal
    %:%.o
    echo fi
    $(cc) $< -o $@
    %.o:%.cpp
    echo se $< $@ $* $^
    $(cc) -c -I./subPath $<
    cl:
    rm -rf *.o signal
    [root@localhost signal]#

    表示的是会根据 all中目标找 同名的 cpp编成 o 再链接成 bin ,如果有头文件的话会到 VPATH中去搜,但是要注意指写 -I参数 

    这个参数可用shell脚本拼相对目录,但是makefile是不能为你做什么。必须手动指定。如果有库的话还要指定 -L 参数 lib的文件路径

    [root@localhost bin]# cat makefile
    #basePath=/home/ctest/signal
    basePath=..
    VPATH=$(basePath)/heard:$(basePath)/src:$(basePath)/o
    cc=gcc
    obj =signal
    all:$(obj)

    $(obj):%:%.o
    echo make the bin
    $(cc) $(basePath)/o/$< -o $(basePath)/bin/$@
    %.o:%.cpp
    echo make the .o file
    $(cc) -c -I$(basePath)/heard $< -o $@
    mv $@ $(basePath)/o
    cl:
    rm -rf $(basePath)/o/*.o $(basePath)/bin/signal $(basePath)/*.o $(basePath)/signal $(basePath)/bin/*.o
    [root@localhost bin]#

    注意目录名不要写错了,还有就是变量中二进制目标那层是不能直接写成%:%.o 的而要写成$(obj):%:%.o

    还要特别注意的是前面带了具体的值时$<之类的自动变量取出来的是 $(obj)里面的目标字符串,并不带目录的,而通配符在前面的目标命令中

    的自动变量是自动会加上找到的文件的目录路径的。如%.o:%.cpp这个。

    总结一下就是

       因为上层目标给出的就只有一个字符串,(不然人家也不知道你要生成啥,总有个头)

       你给出目标后才会去找生成这个目标的依赖,而找到的值才会有全路径的。

  • 相关阅读:
    JVM(二)JVM内存布局
    JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译
    阿里面试
    npm run dev/npm run start报错
    vue 项目报错 You may use special comments to disable some warnings.
    ES6模块化
    jQuery中的动画
    jsonp的封装
    ajax中get,post,以及二合一的封装
    小案例之刮奖
  • 原文地址:https://www.cnblogs.com/heling/p/3443342.html
Copyright © 2011-2022 走看看