【问题标题】:Makefile to convert all *.c to *.oMakefile 将所有 *.c 转换为 *.o
【发布时间】:2015-04-18 00:30:32
【问题描述】:

我正在编写一个 Makefile 用于将目录中的所有 *.c 文件编译到 *.o 。 *.c 文件很多,所以我不想单独做,

我试过了

%.o: %.c
        $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

但这不起作用...请帮助我了解这里出了什么问题...

【问题讨论】:

  • 错误信息是什么..
  • 请注意,隐式规则已经允许您从 .c 文件创建 .o 文件。除非您想做一些不同的事情,否则您无需为此提供自己的规则。

标签: c makefile gnu-make


【解决方案1】:

你可以添加一个规则OBJS,它会为你做的

OBJS    = $(SRCS:.c=.o)

SRCS 中有你的.c 文件,如果它们太多的话:

SRCS    = $(wildcard *.c)

然后在运行时添加它make

$(NAME) : $(OBJS)
          [...]

【讨论】:

  • 是的,我一直对我的所有代码都这样做,它工作得很好。让我做一个 pastebin 给你看。
  • 这应该是一个反问,但也许你有一个适用的 make 版本。您使用的是哪个版本?这在 v 3.8 中不起作用。我的答案中的代码运行良好。
  • 必须解决一些问题,我的通配符错了,谢谢你告诉我! pastebin.com/F0LUd8a4
  • 我已经编译了一个现有项目,只是更改了 SRCS 规则,它运行良好。我只是没有尝试连续编译 2 次,这就是之后失败的原因,只有一次编译在运行 make re 的已编译项目上运行良好
【解决方案2】:

您的规则将单个 .c 文件映射到单个 .o,并镜像现有的 implicit rule

为了生成与一组.c文件对应的所有.o文件,您可以从.c文件列表中创建一个目标文件名列表,然后制作一个依赖于该文件的目标列表:

SRC = $(wildcard *.c)               # list of source files
OBJS = $(patsubst %.c, %.o, $(SRC)) # list of object files
objs : $(OBJS)                      # target

然后生成目标文件

make objs

这将为每个.c 构建一个.o 文件。

【讨论】:

    【解决方案3】:

    您告诉make 如何从对应的*.c 文件中生成*.o。 (不是你需要这样做,因为make 已经知道了很多,至少只要你不尝试比你在规则中写的更具体的东西。)

    你没有告诉 make 你想要任何特定的foo.obar.o,所以 make 什么也不做。

    要么将您要生成的目标文件列表添加到 Makefile,要么专门调用 make foo.o

    ----

    看看它的价值,看看这个……里面有一些技巧和教训,我相信你的好奇心会发现的。最重要的是,它添加了编译器警告和自动头依赖处理。

    这是假设 GNU make 用于例如patsubstfind 的存在和 GCC(用于通过 -MMD -MP 进行的依赖处理)。如果你想跨平台,我建议使用像CMake 这样的元构建系统,我正在使用myself

    PROJNAME := MyProject
    PROJDIRS := subdir1 subdir2
    SRCFILES := $(shell find $(PROJDIRS) -type f -name "\*.c")
    OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
    DEPFILES := $(patsubst %.c,%.d,$(SRCFILES))
    
    WARNINGS := -Wall -Wextra -pedantic -Wshadow -Wpointer-arith -Wcast-align \
                -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations \
                -Wredundant-decls -Wnested-externs -Winline \
                -Wuninitialized -Wconversion -Wstrict-prototypes
    CFLAGS := -g -std=c99 $(WARNINGS)
    
    .PHONY: all clean
    
    all: $(PROJNAME)
    
    clean:
        -@$(RM) $(wildcard $(OBJFILES) $(DEPFILES) $(PROJNAME))
    
    -include $(DEPFILES)
    
    $(PROJNAME): $(OBJFILES)
        @$(CC) $(LDFLAGS) $^
    
    %.o: %.c Makefile
        @$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
    

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多