zoukankan      html  css  js  c++  java
  • makefile练习

    简介

    makefile用于工程构建和管理,在makefile文件内定义编译和链接规则,通过命令即可进行工程的构建。
    在Ubuntu环境下开始学习makefile的使用,记录基础操作。
    makefile文件编写有固定的语法,学习makefile语法可发参考跟我一起写MakeFile网页版 Github

    单个文件夹下的makefile

    新建一个文件夹,在文件夹内创建main.c child.c child.h makefile文件,编译产生的中间文件都放在这个目录下

    child.h

    #ifndef _CHILD_H
    #define _CHILD_H
    
    #include <stdio.h>
    
    void child_show(int num);
    
    #endif
    

    child.c

    #include "child.h"
    
    void child_show(int num)
    {
    	printf("Child show %d",num);
    }
    

    main.c

    #include "child.h"
    
    int main(void)
    {
    	printf("main run,next is child
    ");
    	child_show(255);
    	printf("
    ");
    
    	return 0;
    }
    

    makefile

    # 选择编译器
    CC=gcc
    CFLAGS=-g -O2 -Wall
    
    # 链接生成执行文件main,依赖 main.o 和 child.o
    main:main.o child.o
            ${CC} main.o child.o -o main
    
    # 编译生成main.o,依赖 main.c 和 child.h
    main.o:main.c child.h
            ${CC} ${CFLAGS} -c main.c
    
    # 编译生成child.o,依赖child.c 和 child.h
    child.o:child.c child.h
            ${CC} ${CFLAGS} -c child.c
    
    .PHONY : clean
    # 清除编译产生的文件
    clean : 
            @echo 清除编译结果
            -rm -f *.o main
    

    多文件makefile

    当文件较多时可能会分文件夹存储,比如创建文件夹bin src inc obj,bin文件用于放置链接的执行文件,src文件夹放置源码文件,inc文件放置Header文件,obj放置编译产生的文件。以单文件夹的文件为例,把main.c child.c放到src文件夹,child.h放到inc文件夹,文件内容不变,修改makefile内容

    # 设置目录变量
    DIR_SRC=./src
    DIR_INC=./inc
    DIR_OBJ=./obj
    DIR_BIN=./bin
    
    # 设置可执行文件
    TARGET=main
    BIN_TARGET=${DIR_BIN}/${TARGET}
    
    # 配置源文件和 .o 文件
    SRC=$(wildcard ${DIR_SRC}/*.c)
    OBJ=$(patsubst %.c, ${DIR_OBJ}/%.o, $(notdir ${SRC}))
    
    # 设置编译器和头文件路径(-I指定.h文件路径)
    CC=gcc
    CFLAGS=-g -O2 -Wall -I${DIR_INC}
    
    # 链接生成可执行文件
    ${BIN_TARGET}:${OBJ}
            ${CC} ${OBJ} -o $@
    
    # 编译,使用 % 进行匹配
    ${DIR_OBJ}/%.o:${DIR_SRC}/%.c
            ${CC} ${CFLAGS} -o $@ -c $<
    
    .PHONY : clean
    # 清除可执行文件和编译文件
    clean : 
            @echo 清除编译结果
            -rm -f ${BIN_TARGET} ${OBJ}
    
    
  • 相关阅读:
    Flutter采坑之路 Run Configuration error:broken configuration due to unavailable
    Android24以上拍照代码
    android Studio 出现:Unable to resolve dependency for ':app@debug/compileClasspath'
    Android Studio 使用本地gradle配置详解
    windows server2008 IIS搭建网站简易教程(阿里云)
    FileProvider 添加二级目录
    Android中如何解决editText一进入activity就自动获取焦点的bug
    关于AndroidStudio 经常弹出TortoiseSVN 同步的解决办法
    Awesome-VR
    Magento2 常见错误 ----- 定期更新
  • 原文地址:https://www.cnblogs.com/niu-li/p/13125679.html
Copyright © 2011-2022 走看看