【问题标题】:How to make `make` make an a executable for each C file in a folder?如何使`make`为文件夹中的每个C文件生成一个可执行文件?
【发布时间】:2012-04-03 14:26:29
【问题描述】:

我的问题看似简单,但为了找到解决方案,我已经浪费了几个小时的学习时间。我正在尝试创建一个 Makefile,它为目录中的每个 .c 文件构建一个可执行文件。

我尝试了以下方法:

CC = gcc
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRCS))

all: $(OBJS)
$(CC) $< -o $@

%.o: %.c
    $(CC) $(CPFLAGS)  -c  $<

但是这样它只会创建.o 文件,而不是任何可执行文件。我需要一个规则来为每个.o 文件创建一个可执行文件。类似于以下内容:

gcc src.o -o src

【问题讨论】:

标签: c makefile


【解决方案1】:

rob's 答案似乎不适用于我的机器。也许,作为完整的 Makefile:

SRCS = $(wildcard *.c)

all: $(SRCS:.c=)

.c:
     gcc $(CPFLAGS) $< -o $@

(最后两行在我的机器上,不需要,因为默认规则就足够了。)

【讨论】:

  • 这正是我想要的。非常感谢。无法正确使用':.'
  • @eduardomoroni:您应该注意您的宏名称CPFLAGS 是非标准的。它通常应该是 CFLAGSCPPFLAGS 或两者兼而有之。见CFLAGS vs CPPFLAGS
  • 不错的答案。添加clean 目标怎么样?
  • 至少对于 GNU make.c 规则是完全没有必要的(也不值得自己声明)—— GNU make 知道如何在没有明确规则的情况下从 C 文件构建。否则一切都好:)
【解决方案2】:

您的all 告诉它只是构建目标文件。添加类似的东西

EXEC = $(patsubst %.c,%,$(SRCS))

全部:$(EXEC)

【讨论】:

    【解决方案3】:

    这是我用来编译一堆方案文件的Makefile。

    SRCS = $(wildcard *.scm)
    
    all: $(SRCS:.scm=)
    
    %: %.scm
        chicken-csc -o $@ $<
    

    【讨论】:

      【解决方案4】:

      尝试以下方法:

      % : %.c
          $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $<
      all: $(basename $(wildcard *.c))
      

      而且您甚至不需要前两行,因为make 知道如何将 .c 文件编译和链接到可执行文件中。不过,经常需要更改make 的内置配方。

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        相关资源
        最近更新 更多