首页
学习
活动
专区
工具
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文件模式相对于文件所在目录匹配。 在子目录文件定义模式优先于高于根目录模式。

8K10

如何使用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

12510

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.5K40

通用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” 包含

42320

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

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

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

27820

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

26510

Makefile 入门教程

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

30220

Makefile 入门教程

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

21220

实战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 .

45020

如何编写一个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文件啦。

3K30

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

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

7310

一步步写属于自己makefile

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

60730

一个通用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.4K111

Linux学习笔记(二)、常用指令(下)

1、编译文件 gcc [文件名]即可 这样会在目录下生成一个.out可执行文件,运行该.c文件使用指令时./c。如果想指定生.c文件名,使用gcc [xxx.c] -o [自定义文件名即可] ?...4、makefile编译脚本 1、脚本创建 在main.c目录创建Makefile文件,首字母M一定要大写!,之后在Makefile文件输入脚本内容,每一行首需要空出来地方一定要使用TAB键!...make会为Makefile每个以TAB开始命令创建一个shell进程去执行 clean作为目标,没有目标文件,执行clean功能直接使用make clean,执行以后就会删除当前目录下所有的....4.4、变量追加+= 与Qt.pro文件添加属性类似,C知识点。 ? 6、Makefile模式规则 在有多个.c文件需要生成.o文件时,可以通过模式规则将所有的.c文件变为对应.o文件。...伪目标的主要作用是避免Makefile定义只执行命令目标和工作目录实际文件出现名字冲突。

2.4K21

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命令查看一下当前目录结构: 重要说明

5K10

使用VisualGDB开发Keil MDK-ARM项目

前言 本教程展示了如何使用VisualGDB使用Keil MDK-ARM编译器构建项目,使用VisualGDB智能感知包括CodeMap,并使用Visual Studio调试它。...如果您没有太多文件,您可以选择“显示所有源文件在一起”,以平展Keil目录结构: ? 选择一个调试方法。在本例,我们将使用STM32F411RE核子板中集成了ST-LinkOpenOCD: ?...“-c”和“-o”等指定文件选项。它们是由Makefile自动添加。 下表对示例uVision项目的选项进行了分类: ? 首先,我们将向项目属性添加与智能感知相关选项。...转到Makefile Settings页面,除去uVision flags除了-g和-O0之外所有gc特定标志(也禁用二进制文件生成): ? 稍后我们将指定特定于keil标志。...这将确保GDB将初始化数据以Keil期望方式放入FLASH: ? 经过修改Makefile片段如下所示(片段名称和地址取决于设备,应该从原始elf文件转储取出): ?

2.2K30

Makefile总结

目前centos 7.3 GNUmake版本是3.82 为什么要用Makefile 在做C/C++开发过程,比如有如下文件: a.c b.c main.c 编译生成可执行二进制文件 gcc a.c...上边Makefile,在执行make clean 后会删除.o和可执行文件,如果在当前目录下创建一个名称为clean文件,再执行make clean后会提示: make: “clean”是最新。...这种情况可以使用伪目标来解决,可避免在makefile定义执行命令目标和当前目录下实际文件名冲突。 一旦定义为伪目标,make执行规则不会去查找隐含规则,同样也提高了效率。...在上边Makefile把clean定义为伪目标即可 .PHONY:clean 还有个特表伪目标 all ,如我们通过Makefile创建多个可执行文件时,可以使用到: 如: all: bin1 bin2...,添加文件夹,把源码都放入src和lib文件夹,保持增量编译,即为Makefile通用模板 EXE = helloworld GCC = g++ SUBDIR = src lib CPP_SOURCES

92610
领券