一、Makefile文件

为了方便分析,直接上文件,Makefile 文件中的内容如下所示:

#
# Makefile
# 编译的.o文件和.c文件在同一路径下
# $(info "start...")
# 可执行文件名
PROJECT_NAME = app ##################################### 项目路径 #####################################
PROJECT_PATH ?= ${shell pwd}
OBJ_DIR := $(PROJECT_PATH)/build ##################################### 设置编译器,默认使用GCC #####################################
CC ?= gcc ##################################### 所需头文件的路径 #####################################
CFLAGS += -I$(PROJECT_PATH)/lib/inc ##################################### 编译和链接参数 #####################################
CFLAGS ?= -O3 -g0 -Wall -Wshadow -Wundef -Wmissing-prototypes
LDFLAGS ?= -lm ##################################### 收集需要编译的源文件 #####################################
CSRCS += $(PROJECT_PATH)/application/main.c
include $(PROJECT_PATH)/lib/lib.mk ##################################### 将文件名替换为.o文件 #####################################
CXX_OBJCTS = $(patsubst %.c, $(OBJ_DIR)/%.o, $(notdir $(CSRCS)))
SOURSE_DIR = $(dir $(CSRCS)) vpath %.c $(SOURSE_DIR) $(OBJ_DIR)/%.o: %.c
@$(CC) $(CFLAGS) -c $< -o $@
#@echo "CC $<" all: $(CXX_OBJCTS)
@$(CC) -o $(PROJECT_NAME) $(CXX_OBJCTS) $(LDFLAGS) clean:
@rm -f $(PROJECT_NAME) $(CXX_OBJCTS)

二、代码分析

  1. 查找所有.c文件

    # 方式一
    CSRCS += $(PROJECT_PATH)/application/main.c # 方式二
    CXX_SOURCES = $(foreach dir,$(CSRCS), $(wildcard $(dir)/*.c))

    注意:方式一是直接将所有的 .c 文件追加到 CSRCS 变量中,方式二是将搜索路径下的所有 .c 文件,并追加到 CSRCS 变量中。

  2. 将所有的 .c 文件换成 .o 文件

    # 方式一
    COBJS = $(CSRCS:.c=.o)
    # 方式二
    COBJS= $(patsubst %.c, %.o, $(CSRCS))

    注意:方式一和方式二原理都是一样的,其目的是将所有的 .c 文件换成 .o 文件而已

  3. 生成 .o 文件

    /%.o: %.c
    @$(CC) $(CFLAGS) -c $< -o $@
    #@echo "CC $<"

    注意:第2点只是将 .c 文件 换成了 .o 文件名,得到的只是文件名称而已,这里才是根据相应的目标生成 .o 文件

  4. 链接成可执行文件

    将所有的 .o 文件链接成可执行文件

    @$(CC) -o $(PROJECT_NAME)  $(CXX_OBJCTS) $(LDFLAGS)
  5. 清理所有的 .o 文件

    @rm -f $(PROJECT_NAME) $(CXX_OBJCTS)

注意:以上就是 make 的编译流程,但是编译生成的 .o 文件和.c 文件是在同一目录下的,不满足我们的需求,接着网下看

  1. 将所有的 .o 文件放到指定目录下

    CXX_OBJCTS = $(patsubst  %.c, $(OBJ_DIR)/%.o, $(notdir $(CSRCS)))

    注意: notdir $(CSRCS) 函数是去掉文件路径,只保留文件名,如此便可以在替换后缀的时候,在文件前面加上指定路径

  2. 完成指定路径下的所有 .o 文件的目标

    $(OBJ_DIR)/%.o: %.c
    @$(CC) $(CFLAGS) -c $< -o $@
    #@echo "CC $<"

    注意:这里的作用在源文件中查找能制作目标的文件,因为这里的目标和源文件不在同一目录下,所以需要完成第8点的操作

  3. vpath 和 VPATH

    这里我也不是很理解,在自动目标中需要将源文件路径加入 vpath 或 VPATH 中,如下所示:

    # 方式一
    VPATH += :$(SRC_DIR)
    # 方式二
    SOURSE_DIR = $(dir $(CSRCS))
    vpath %.c $(SOURSE_DIR)

    注意:函数 dir 的作用是提取所有文件的路径

参考链接

linux Makefile 如何将生成的.o文件放到指定文件:https://blog.csdn.net/forgetjoker/article/details/117676029

linux Makefile 如何将生成的 .o 文件放到指定文件夹的更多相关文章

  1. C# 将引用的DLL文件放到指定的目录下

    原文:C# 将引用的DLL文件放到指定的目录下 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sweety820/article/details/2 ...

  2. C# 获得目录下所有文件或指定文件类型文件(包含所有子文件夹)

    public partial class FileGet { /// <summary> /// 私有变量 /// </summary> private static List ...

  3. Python复制指定目录的各个子目录下的同名文件到指定文件夹并重命名

    Python复制指定目录的各个子目录下的同名文件到指定文件夹并重命名 #编码类型 #-*- coding: UTF-8 -*- #导入包 import os import shutil srcpath ...

  4. Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键 批量修改文件名等

    http://blog.sina.com.cn/s/blog_62e7fe670101dg9d.html linux下二进制文件查找: strings 0000.ts | grep -o " ...

  5. python 拷贝文件夹下所有的文件到指定文件夹(不包括目录)

    1.随便简单些写了一下.直接粘结代码,只是简单的实现一下,还很多需要完善和扩展的地方,比如忽略掉后缀文件,删除文件 如果排除的某些的话可以用: sourceF.find('.后缀')>0 2.注 ...

  6. ubuntu上解压目录里的文件到指定文件夹

    去除目录结构加上 --strip-components N 如: 压缩文件eg.tar 中文件信息为 src/src/src/eg.txt 运行 tar -xvf eg.tar --strip-com ...

  7. PHP 解压 ZIP 文件到指定文件夹

    本类实现参考 php manual 评论 [php] view plain copy /** * function: 解压zip 格式的文件 * author:friker * date:2015-1 ...

  8. Java 遍历文件夹里面的全部文件、指定文件

    Java 手册 listFiles public File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件 ...

  9. Java操作FTP,从FTP上读取指定文件,把指定文件上传到FTP

    需要添加的依赖 <!-- https://mvnrepository.com/artifact/commons-net/commons-net --> <dependency> ...

  10. python 合并目标文件夹中多个txt文件到指定文件中

    # coding = 'utf-8' # description: 合并目标文件夹中多个txt文件,到指定文件中. import os def file_merge_to_one(dirpath): ...

随机推荐

  1. Oracle 关闭 DBLink

    alter system set open_links=0 sid ='*' scope=spfile; System altered. alter system set open_links_per ...

  2. 连接Windows 平台 KingbaseES异常

    概述 应用连接Windows平台的KingbaseES 数据库,报错"com.kingbase8.util.KSQLException: 致命错误: 用户"system" ...

  3. #差分约束系统#CodeChef Digit Matrix&洛谷 7515 [省选联考 2021 A 卷] 矩阵游戏

    洛谷传送门 DGMATRIX 分析 先任意构造出一个不一定满足值域的矩阵,现在只需要满足值域就可以了. 可以发现,给一行或一列依次加一减一2*2矩阵的和仍然不变,并且如果有解一定能构造出一组方案. 因 ...

  4. #斐波那契#洛谷 3424 [POI2005] SUM-Fibonacci Sums

    题目 已知\(x,y\)的斐波那契表示,求\(x+y\)的斐波那契表示 分析 显然得到两条性质: \(f_{i+1}=f_{i-1}+f_i\) \(2f_i=f_{i+1}+f_{i-2}\) 那么 ...

  5. 在DAYU200上实现OpenHarmony跳转拨号界面

    一.简介 日常生活中,打电话是最常见的交流方式之一,那么如何在OpenAtom OpenHarmony(简称"OpenHarmony")中进行电话服务相关的开发呢?今天我们可以一起 ...

  6. 帕鲁重大更新!macOS 竟然也能玩了

    近日,<幻兽帕鲁>迎来了 v0.2.1.0 大版本的更新. 本次更新的最大亮点是新实装的突袭头目系统.玩家可以在 "召唤祭坛" 献祭石板,从而召唤强大的突袭头目.其中, ...

  7. Ubuntu部署Django一:环境搭建

      前言: Ubuntu系统上部署django,使用的部署方案是 Ubuntu + django + uwsgi + nginx Ubuntu系统版本用的是 ubuntu-20.04.2.0-desk ...

  8. apache 服务器配置常用知识点合集

    前言 因为当年周围同学都在学php,最为简单的就是学php 好就业啊,写个一些php,最后放弃了,apache也看了两眼吧.下面是我使用有记录的,没有记录的我后面会补上. 正文 域名配置 1.取消 N ...

  9. 深度解读《深度探索C++对象模型》之拷贝构造函数

    接下来我将持续更新"深度解读<深度探索C++对象模型>"系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文. 写作不易,请有心人到我的公众号上 ...

  10. Vue 路由组件传参的 8 种方式

    我们在开发单页面应用时,有时需要进入某个路由后基于参数从服务器获取数据,那么我们首先要获取路由传递过来的参数,从而完成服务器请求,所以,我们需要了解路由传参的几种方式,以下方式同 vue-router ...