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

9.2K10

如何使用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的目录,任何大小均可,大家测试时可以使用下列代码库: tennc的webshell: https://github.com/tennc

20410
  • 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

    库的制作 与 使用 (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 使得该配置文件生效 这样子我们就可以直接使用这个库啦

    9710

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

    58020

    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文件中的目标。

    30420

    Linux中Makefile文件详解

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

    1K10

    Makefile 入门教程

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

    43020

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

    48920

    Makefile 入门教程

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

    25720

    如何编写一个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.9K30

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

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

    11110

    一步步写属于自己的makefile

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

    65130

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

    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

    开篇:预备知识---2

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

    77420
    领券