V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bigshot
V2EX  ›  程序员

如何用 Makefile 管理你的工程?

  •  
  •   bigshot · 2018-04-18 12:40:20 +08:00 · 4367 次点击
    这是一个创建于 2171 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文链接: https://blog.csdn.net/qq_38646470/article/details/79917494

    专栏链接: https://blog.csdn.net/column/details/20028.html

        或许很多 Winodws 的程序员都不知道这个东西,因为那些 Windows 的 IDE 都为你做了这个工作,但我觉得要作一个好的和 professional 的程序员,makefile 还是要懂。在 Linux 下的软件编译,你就不能不自己写 makefile 了,会不会写 makefile,从一个侧面说明了一个人是否具备完 成大型工程的能力。     makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系 列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。     makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 下面就来看如何写 Makefile 文件: Makefile 文件编写规范:

    目标:依赖文件                               
     $^  代表所有依赖文件
     $@  代表所有目标文件
     $<  代表第一个依赖文件
     %   代表通配符
     @指令:屏蔽指令
    定义变量(变量大写)
    变量名=值 1 值 2 ...
    使用变量 $(变量名)
    

    下来看事例: 假设我们有很多个文件( fun1.c fun2.c fun3.c main.h ) 假设最后我们就想得到 main 一个文件 初级版:

    .PHONY : clean
    
    main : fun1.o fun2.o fun3.o main.o
    	gcc -g fun1.o fun2.o fun3.o main.o -o main
    fun1.o : fun1.c main.h
    	gcc -Wall -c -g -o fun1.o
    fun2.o : fun2.c main.h
    	gcc -Wall -c -g -o fun2.o
    fun3.o : fun3.c main.h
    	gcc -Wall -c -g -o fun3.o
    
    clean :
    	rm -rf *.o
    

    精简版

    .PHONY : clean
    
    FM=fun1.o fun2.o fun3.o main.o
    
    main : $(FM)
    	(前面一个 tab 键)gcc -g $^ -o $@
    %.c : %.o
    	(前面一个 tab 键)gcc -c -g - Wall $< -o $@
    clean :
    	(前面一个 tab 键)rm -rf *.o
    
    

    看看测试效果: 这里写图片描述 当然 Makefile 还有很多其他的用处,如需更深层次了解请看makefile 深度解析

    25 条回复    2018-04-19 11:44:35 +08:00
    zhengxiaowai
        1
    zhengxiaowai  
       2018-04-18 12:44:48 +08:00
    cmake 了解一下。。。好久没手写 makefile 了
    bigmouthhaile
        2
    bigmouthhaile  
       2018-04-18 13:06:55 +08:00 via Android
    对啊,cmake,多方便
    hxndg
        3
    hxndg  
       2018-04-18 13:59:19 +08:00
    @zhengxiaowai
    @bigmouthhaile
    你们是什么 py 关系?为啥头像一样的?

    ps 我看你写的这些字和那些 makefile 感觉和陈皓的《跟我一起写 Makefile 》非常像,不知道有没有什么关系

    @Livid 这个算不算是推广?
    MeteorCat
        4
    MeteorCat  
       2018-04-18 14:02:21 +08:00 via Android
    我感觉 cmake 更方便一点,makefile 的学习成本好高
    fgodt
        5
    fgodt  
       2018-04-18 14:04:41 +08:00 via Android
    还是 cmake 爽点
    enenaaa
        6
    enenaaa  
       2018-04-18 14:08:21 +08:00
    真的很讨厌写编译脚本。 写程序够辛苦了, 还要被这些莫名其妙的玩意占用时间。 这破事就不能让 ide 搞定吗, 或者分出个专门写编译脚本的工作吧。
    seeker
        7
    seeker  
       2018-04-18 14:20:04 +08:00
    c/c++ 的最大门槛就这玩意。
    bigshot
        8
    bigshot  
    OP
       2018-04-18 19:51:24 +08:00 via Android
    @zhengxiaowai 是么 我还没使用过 cmake
    bigshot
        9
    bigshot  
    OP
       2018-04-18 19:52:36 +08:00 via Android
    @enenaaa 的确,但是技多不压身,多学点
    bigshot
        10
    bigshot  
    OP
       2018-04-18 19:53:06 +08:00 via Android
    @seeker 好好看看
    linthieda
        11
    linthieda  
       2018-04-18 19:55:03 +08:00 via iPhone
    cmake 感觉魔法操作方法
    , 编译小工程还是喜欢用 make
    bigshot
        12
    bigshot  
    OP
       2018-04-18 20:42:25 +08:00 via Android
    @linthieda 细说一下
    iceheart
        13
    iceheart  
       2018-04-18 21:14:44 +08:00 via Android
    还是手写 Makefile 放心,项目里有 java,go,c++,node。要编译打包,不知道 CmakeLists.txt 该咋写,直接写 Makefile 也没几行代码,简单快速直接。
    goodspb
        14
    goodspb  
       2018-04-18 21:16:56 +08:00 via iPhone
    http://www.hahack.com/codes/cmake/
    看了这个之后,就一用 cmake 了…
    lbtinglb
        15
    lbtinglb  
       2018-04-18 21:32:19 +08:00
    Ranler
        16
    Ranler  
       2018-04-18 21:40:39 +08:00
    最近看几个 GoLang 项目都是 makefile 管理的,包括 Kubernetes
    bigshot
        17
    bigshot  
    OP
       2018-04-18 23:13:59 +08:00
    @Ranler 感觉怎么样?
    @iceheart 赞同
    bigshot
        18
    bigshot  
    OP
       2018-04-18 23:17:07 +08:00
    @lbtinglb 谢谢
    iwtbauh
        19
    iwtbauh  
       2018-04-18 23:18:40 +08:00 via Android
    补充:
    %.c : %.o 是 GNU 语法扩展,不属于 POSIX 的 Makefile 标准,仅适用于 GNU,仅适用于 GNU,仅适用于 GNU
    为了可移植性,应该尽量避免使用之
    Ranler
        20
    Ranler  
       2018-04-18 23:22:13 +08:00
    @bigshot 还好啊,封装一些宏之后,make 直接做编译打包测试
    waruqi
        21
    waruqi  
       2018-04-18 23:27:46 +08:00 via Android
    推广一波,换 xmake 吧。用直观简洁的语法来描述工程。http://xmake.io
    bigshot
        22
    bigshot  
    OP
       2018-04-18 23:27:58 +08:00
    @iwtbauh 谢谢。
    @Ranler 了解,谢谢
    bigshot
        23
    bigshot  
    OP
       2018-04-18 23:28:49 +08:00
    @waruqi 好的,回头了解下
    keysking
        24
    keysking  
       2018-04-19 08:35:57 +08:00
    makefile 还是打扰了,让 CMake 帮我生成吧
    bigshot
        25
    bigshot  
    OP
       2018-04-19 11:44:35 +08:00 via Android
    @keysking 细说一下,cmake
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1502 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 23:54 · PVG 07:54 · LAX 16:54 · JFK 19:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.