首页
学习
活动
专区
工具
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

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

相关·内容

  • Makefile经典教程(掌握这些足够)

    makefile很重要       什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

    02

    什么是makefile(3)

    六、另类风格的makefile 即然我们的make可以自动推导命令,那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make来说很容易,谁叫它提供了自动推导命令和文件的功能呢?来看看最新风格的makefile吧。 objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) $(objects) : defs.h kbd.o command.o files.o : command.h display.o insert.o search.o files.o : buffer.h .PHONY : clean clean : rm edit $(objects) 这种风格,让我们的makefile变得很简单,但我们的文件依赖关系就显得有点凌乱了。鱼和熊掌不可兼得。还看你的喜好了。我是不喜欢这种风格的,一是文件的依赖关系看不清楚,二是如果文件一多,要加入几个新的.o文件,那就理不清楚了。

    02
    领券