首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用Makefile规则将.o文件放入单独的目录中

在Makefile中,可以使用规则将.o文件放入单独的目录中。以下是一个简单的示例:

首先,创建一个名为src的目录,并在其中创建一个名为main.c的文件:

代码语言:c
复制
#include<stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

然后,创建一个名为obj的目录,用于存放生成的.o文件。

接下来,创建一个名为Makefile的文件,并在其中添加以下内容:

代码语言:makefile
复制
CC := gcc
CFLAGS := -Wall -Wextra -std=c99
LDFLAGS :=

SRCDIR := src
OBJDIR := obj

SOURCES := $(wildcard $(SRCDIR)/*.c)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

EXECUTABLE := main

.PHONY: all clean

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
	$(CC) $(LDFLAGS) $^ -o $@

$(OBJDIR)/%.o: $(SRCDIR)/%.c
	@mkdir -p $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	rm -rf $(OBJDIR)
	rm -f $(EXECUTABLE)

在这个Makefile中,我们定义了以下变量:

  • CC:C编译器的路径,这里使用的是gcc
  • CFLAGS:C编译器的选项,包括警告选项、C标准等。
  • LDFLAGS:链接器的选项,这里暂时为空。
  • SRCDIR:源代码所在的目录,这里为src
  • OBJDIR:生成的.o文件所在的目录,这里为obj
  • SOURCES:所有的源代码文件,使用wildcard函数获取。
  • OBJECTS:所有的.o文件,使用subst函数从源代码文件名转换为.o文件名。
  • EXECUTABLE:最终生成的可执行文件名,这里为main

在Makefile中,我们定义了以下目标:

  • all:默认目标,生成可执行文件。
  • clean:清理生成的文件。

$(EXECUTABLE)目标中,我们使用链接器将所有的.o文件链接成可执行文件。

$(OBJDIR)/%.o: $(SRCDIR)/%.c规则中,我们使用C编译器将源代码文件编译为.o文件,并将其放入$(OBJDIR)目录中。

现在,执行make命令,将生成main可执行文件,并将所有的.o文件放入obj目录中。

推荐的腾讯云相关产品:

  • 腾讯云云服务器:提供高性能、高可靠的云服务器,支持一键部署各类应用。
  • 腾讯云对象存储:提供可扩展的云存储服务,支持文件的高效上传和下载。
  • 腾讯云数据库:提供MySQL、MongoDB等多种数据库服务,支持自动备份和恢复。
  • 腾讯云容器服务:支持弹性伸缩、负载均衡等功能,提供Docker容器解决方案。
  • 腾讯云云原生:提供Kubernetes、Serverless等云原生解决方案。

产品介绍链接地址:https://cloud.tencent.com/product

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何使用.gitignore忽略Git文件目录

通常,在项目上使用Git工作时,你会希望排除将特定文件目录推送到远程仓库库情况。.gitignore文件可以指定Git应该忽略未跟踪文件。...在本教程,我们将说明如何使用.gitignore忽略Git文件目录。包括常见匹配模式*星号,斜杠/,#井号注释,?...一些常见例子包括:运行时文件,例如日志,锁定文件,缓存或临时文件。具有敏感信息文件,例如密码或API密钥。已编译代码,例如.class或.o。...,则该模式匹配除指定集合字符以外任何字符。 例如模式*.[oa]将匹配文件file.o,file.a。模式*.[!oa]将匹配file.s,file.1但不匹配file.0与file.a。...但是,你可以在仓库不同子目录创建多个.gitignore文件。.gitignore文件模式相对于文件所在目录匹配。 在子目录文件定义模式优先于高于根目录模式。

8.9K10

如何使用ShellSweep检测特定目录潜在webshell文件

关于ShellSweep ShellSweep是一款功能强大webshell检测工具,该工具使用了PowerShell、Python和Lua语言进行开发,可以帮助广大研究人员在特定目录检测潜在webshell...功能特性 1、该工具只会处理具备默写特定扩展名文件,即webshell常用扩展名,其中包括.asp、.aspx、.asph、.php、.jsp等; 2、支持在扫描任务中排除指定目录路径; 3、在扫描过程...,可以忽略某些特定哈希文件; 运行机制 ShellSweep提供了一个Get-Entropy函数并可以通过下列方法计算文件内容熵: 1、计算每个字符在文件中出现频率; 2、使用这些频率来计算每个字符概率...(这是信息论公式); 工具下载 广大研究人员可以直接使用下列命令将该项目源码克隆至本地: git clone https://github.com/splunk/ShellSweep.git 相关模块...我们可以直接给ShellScan.ps1脚本传递一些包含webshell目录,任何大小均可,大家测试时可以使用下列代码库: tenncwebshell: https://github.com/tennc

18210
  • make命令和makefile文件

    makefile文件由一组依赖关系和规则构成,每个依赖关系由一个目标和一组该目标所依赖文件组成,而规则描述了如何通过这些依赖文件创建目标,一般来说,目标是一个单独可执行文件。...,规则所在行必须以制表符开头,用空格是不行,如果makefile文件某行以空格结尾,也可能导致make命令执行失败。...a.h b.h gcc -c 2.c 3.o: 3.c b.h c.h gcc -c 3.c 1.3 makefile文件宏   为了让makefile文件在面对大项目时不至于过于庞大和缺乏弹性...,makefile文件允许使用宏以一种更通用格式来书写它们   MACRONAME = value (MACRONAME)或{MACRONAME}或   若要定义一个值为空宏,可以MACRONAME...,由于clean:后面是空,因此该目标总被认为是过时,所以在执行make命令时,如果指定目标clean,则目标所对应则将总被执行   install:将编译成功应用程序安装到另一个目录

    2.6K40

    通用Makefile使用及解析

    一、源码使用 1、工程预览 使用 tree 命令查看文件树形结构 example 目录文件为待添加 Makefile 源码,Makefile_and_readme 目录文件为通用 Makefile..."subdir/"斜杠"/"不可省略 2. 顶层 Makefile CFLAGS 在编译任意一个 .c 文件时都会使用 3....三、顶层目录 Makefile.build: 这是最复杂部分,它功能就是把某个目录及它所有子目录、需要编进程序去文件都编译出来,打包为 built-in.o 详细讲解请看视频。...四、怎么使用这套 Makefile: 1.把顶层 Makefile, Makefile.build 放入程序顶层目录 在各自子目录创建一个空白 Makefile 2.确定编译哪些源文件...①、在 Makefile 文件确定要编译文件目录,比如: obj-y += main.o obj-y += a/ “Makefile文件总是被 “Makefile.build” 包含

    53420

    制作 与 使用 (Linux下)

    如何更好让别人使用 我们通常不会只有一个头文件和源文件,因此生成.h文件和编译后生成.o文件不止一个,因此需要对各个文件分类进行打包压缩,我们通常采用如下处理办法: 头文件放入一个名为....o:要被打包.o文件列表 makefile参考 以上各个步骤可以用makefile来完成,以下是makefile参考 # 静态库 liboutput.a:myprint.o mymath.o...(静态库) 导入环境变量(动态库) 放入/etc/ld.so.conf.d/配置文件 法一:放入系统路径 编译器编译时默认去以下路径查找文件文件:/usr/include...,如果这个库函数出了问题,则将影响公司 时间久了,你也搞不清楚是哪个文件问题,这就需要运维人员去查找日志信息,这花费时间和精力 法二:放入环境变量 要输入以下命令: export LD_LIBRARY_PATH...(要sudo权限) sudo vim zi_ji_de_ku.conf 将动态库路径放入文件,保存退出 退出后,ldconfig 使得该配置文件生效 这样子我们就可以直接使用这个库啦

    9110

    5个编写高效Makefile文件最佳实践

    在本文中,我们将讨论如何编写高效Makefile文件,以提高我们开发效率和产品质量 --- 确定目标 在编写Makefile文件之前,我们需要明确我们目标是什么。...--- 使用变量 Makefile变量可以使我们代码更加模块化和可维护。我们可以将常量放入变量,以便在整个Makefile重复使用。...例如,我们可以将编译器路径、编译器选项和库路径都放入变量。此外,我们还可以在变量存储其他有用信息,例如项目名称、版本号等。...例如,我们可以使用以下规则来编译所有的.c文件: %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ 这个规则指定了一个目标模式%.o,表示任意以.o结尾目标文件。...通过这个规则,我们可以轻松地编译所有的.c文件,而不需要为每个文件都编写一个单独规则。 --- 使用.PHONY规则 .PHONY规则可以使我们更加精确地指定Makefile文件目标。

    29820

    Make 快速入门

    Makefile使用 make 之前,你必须在当前目录下添加一个 Makefile 文件,它描述了文件之间依赖(输入输出)关系,并提供更新文件 Shell 命令。...在 Makefile 所在目录运行不带参数 make 命令: make 会启动 Makefile 文件第一个 target ,本例是 help , make 将 Makefile 第一个出现 target...在不使用项目中安装情况下,即项目目录下 node_modules 里包,完全可以使用 Makefile 来完成一些构建任务,make 优势在于更好管理相互依赖构建任务。 3....build: $(objs) cc -o app $(objs) 4. 函数 make 函数用于处理 Makefile 文件文本,例如:计算操作文件列表,“菜谱”中使用命令等。...隐式规则将告诉 make 如何使用常用技术,让你在使用时不必给出全部细节,简化书写。例如,make 为 C 语言编译提供一个隐式规则。文件名决定将应用哪个隐式规则。

    1.5K10

    实战Makefile前,该知道那些知识?

    make与make clean 生成目标文件规则(make命令): 执行make命令则会根据当前目录Makefile文件定义规则生成对应目标文件。...也许在写Makefile时候,都要养成这样一个习惯,一般风格都是: clean: rm $(obj) *.o 更为稳健做法是(原因:如果当前目录存在clean文件,该命令会执行失败),解决办法...赋值符'+=': Makefile变量是字符串,有时候我们需要给前面已经定义好变量添加一些字符串进去,此时就要使用到符号"+=": OBJ = main1.o main2.o OBJ += main3...这些变量可以让我们更加快速完成Makefile编写,其中自动变量只能在规则命令使用,常用自动变量如下: $@:规则目标 $<:规则第一个依赖文件 $^:规则所有依赖文件 CC...wildcard函数:用于查找指定目录下指定类型文件,函数参数:目录+文件类型,使用方法: SRC = $(wildcard .

    48520

    Makefile 入门教程

    基本概念 目标 (Targets):在 Makefile ,目标是要生成文件或执行操作名称。目标可以是文件名,也可以是伪目标,用于执行特定任务而不生成文件。...依赖项 (Dependencies):依赖项是与目标相关联文件或其他目标,它们在目标生成之前必须存在或已经生成。 规则 (Rules):规则定义了如何生成目标以及生成目标所需命令。...这些函数可以在 Makefile 中用于各种目的,例如文件操作、文本处理和条件判断。 5.2 自动化依赖关系生成 通常,Makefile 依赖关系需要手动维护。...然后使用 -include 指令来包含这些 .d 文件,以自动跟踪依赖关系。 5.3 多目录项目 对于大型项目,通常需要将 Makefile 拆分成多个子目录,每个子目录都有自己 Makefile。...然后,可以使用递归或变量传递来管理这些子目录之间依赖关系。

    41920

    LinuxMakefile文件详解

    使用 Makefile 在项目目录,执行以下命令: 构建项目: make 或 make all。 清理项目: make clean。 4....make 使用一个名为 Makefile 文件,其中包含了一系列规则和指令,描述了文件之间依赖关系以及如何生成目标文件。以下是一个简单 Makefile 文件结构和基本要素: 11....$(EXECUTABLE) 这个 Makefile 文件描述了一个简单项目结构,其中源文件位于 src 目录,目标文件位于 obj 目录,可执行文件位于 bin 目录。...条件语句 Makefile 可以使用条件语句,根据不同条件执行不同指令。...) uninstall: rm -f $(INSTALL_DIR)/$(notdir $(EXECUTABLE)) 在这个示例,install 规则将可执行文件拷贝到指定目录($(INSTALL_DIR

    94910

    Makefile 入门教程

    基本概念 •目标 (Targets):在 Makefile ,目标是要生成文件或执行操作名称。目标可以是文件名,也可以是伪目标,用于执行特定任务而不生成文件。...•依赖项 (Dependencies):依赖项是与目标相关联文件或其他目标,它们在目标生成之前必须存在或已经生成。•规则 (Rules):规则定义了如何生成目标以及生成目标所需命令。...这些函数可以在 Makefile 中用于各种目的,例如文件操作、文本处理和条件判断。 5.2 自动化依赖关系生成 通常,Makefile 依赖关系需要手动维护。...然后使用 -include 指令来包含这些 .d 文件,以自动跟踪依赖关系。 5.3 多目录项目 对于大型项目,通常需要将 Makefile 拆分成多个子目录,每个子目录都有自己 Makefile。...然后,可以使用递归或变量传递来管理这些子目录之间依赖关系。

    25120

    如何编写一个Makefile文件(手把手教你)

    项目如何创建运行 2.2.1 删掉自动生成a.out文件 2.2.2 创建makefile 2.2.3 执行makefile文件 2.2.4 查看目录并运行可执行文件 三、代码优化 3.1 添加clean...编写Makefile就不再需要考虑这些,你把每个文件依赖关系以指令形式说明清楚并且保存下来,改动一个即可,会自动帮你修改关联到其他文件。...”touch”时,如果指定文件不存在,则将创建一个新空白文件。...例如,在当前目录下,使用该指令创建一个空白文件”file”,输入如下命令: $ touch file #创建一个名为“file”空白文件** 2.1.2 查看创建文件 要有优秀编程习惯,...gcc main.c -c -Wall -g -o tool2.o 保存退出,然后查看一下目录(好习惯),发现有一个makefile文件啦。

    3.5K30

    【Linux】《how linux work》第十五章 开发工具

    大多数C程序太大了,无法合理地放在一个单独源代码文件。 庞大文件会使程序员难以组织,而且编译器有时甚至会在解析大文件时出现问题。...双引号意味着头文件不在系统包含目录,但编译器应该在其包含路径搜索。 这通常意味着头文件与源文件位于同一个目录。 如果你在双引号遇到问题,你可能在尝试编译不完整源代码。...C编译器本身对于您系统并不了解,无法单独创建一个有用程序。 您需要使用库来构建完整程序。C库是一组常见预编译函数,您可以将其构建到程序。...您应该知道系统缓存中有哪些共享库,如果将每个奇怪共享库目录放入缓存,会导致冲突和一个非常混乱系统。 当您编译需要一个奇怪库路径软件时,请给您可执行文件设置一个内置运行时库搜索路径。...其中最有用选项之一是在命令行上指定一个单独目标。对于前面的Makefile,如果你只想要aux.o文件,可以运行make aux.o

    10510

    一步步写属于自己makefile

    而且如果后续再添加新文件都不需要更改makefilemakefile3个符号$@,$^,$< 我们在看别的项目中makefile时,经常发现这三个符号,它们到底是意思呢?...# 伪目标的意义就是,无论如何都执行下面的命令 clean: rm -f hello $(OBJS) 上面的makefile需要掌握语法是: patsubst 模式匹配文本并替换...虽然这个makefile使用上没有任何问题,但是,我们发现上面的.o目标文件遵循就近原则,散落在各个目录下。...有时候,我们可能希望生成一个编译目录,把所有的中间过程文件放入其中,从而不会污染我们源代码,那该怎么实现呢?...4 指定编译目录 假设我们在源码root目录下创建一个新目录build/,作为编译过程中间文件存放位置,新makefile如下: # hello由hello.o生成,所以hello依赖于hello.o

    64530

    一个通用Makefile(二)

    “obj-y += subdir/”表示进入subdir这个子目录下去寻找文件来编进子程序; 2、顶层目录Makefile: CROSS_COMPILE =                       ...: 1> 执行顶层目录makefile程序时,先进入顶层目录,发现有些文件目录,将会进入如DSVICICOMSVC/ 2> 进入子目录后,又会发现又有子目录makefile,DSVICICOMSVC...、DSVICICOMMGR,执行子目录makefile; 3> 把test.c编译成test.o,把test目录.o文件打包成build_in.o 4> 经过多个子目录后,回到顶层目录.把main.c...make -C ./ -f  Makefile.build    3、顶层目录Makefile.build: 这是最复杂部分,它功能就是把某个目录及它所有子目录、需要编进程序去文件都编译出来...: $(PHONY) 4、怎么使用这套Makefile: 1.把顶层Makefile, Makefile.build放入程序顶层目录 2.修改顶层Makefile 2.1 修改工具链 2.2 修改编译选项

    1.5K111

    开篇:预备知识---2

    可以看到,除了添加了部分注释之外,#include 指令将 custom1.h 头文件文本内容复制到 #include 指令所在位置了。那么当被包含文件还包含了其他头文件时情况如何呢?...动态链接库 ​ 动态链接库即为动态加载,在链接时不将整个库文件链入可执行程序,只是将库文件信息放入可执行文件。在可执行程序运行时如果需要使用该动态链接库某个模块或者函数时再进行动态加载。...即为当前源程序文件所在目录(相对目录);再通过 -l 参数指定要加载文件,这里指定文件为 custom。GCC 自动补全前缀后文件名为 libcustom。那么后缀名如何确定呢?...要在项目中使用 make 工具,我们需要在项目文件夹下编写 makefile 文件,在执行 make 程序时候,它会到当前工作目录下寻找 makefile 文件并读取其中内容并按照 makefile...b : c); } 最后,我们在 make-test 目录下新建一个名为 makefile 文件使用文本编辑器打开它。

    76920

    Linux — Makefile学习笔记以及多级目录Makefile编写

    零、简单说明(2020.3.9追加) 1、由于Makefile对于制表符(tab)、还有unix和windows对于换行符不同等等原因,本文中所有的Makefile文件内容不建议您直接复制然后粘贴使用...如果未使用这个选项,标准版make命令将优先在当前命令下查找名称为makefile文件,如果不存在名称makefile文件,则开始查找名为Makefile文件。...,且clean始终是最新,所以命令不会被执行,为了避免这个问题,可以使用.PHONY来指明改目标,则将上述clean部分修改为: .PHONY:clean clean: rm -rf $(OBJDIR...)/*.o $(BINDIR) 这样在执行”make clean“时候就不管”clean”文件或者目录是否存在,正常执行makefileclean命令。...rm -rf (OBJDIR)/*.o (BINDIR) #删除编译生成中间文件以及可执行文件存储目录(可执行文件同时被删除) 可以使用tree命令查看一下当前目录结构: 重要说明

    5.5K10
    领券