【问题标题】:I've created a Makefile in c that should creates more than one executable, but it does not work我在 c 中创建了一个 Makefile,它应该创建多个可执行文件,但它不起作用
【发布时间】:2021-03-12 19:51:50
【问题描述】:

我需要做什么

我正在尝试在 c 中创建一个 Makefile,它应该从三个不同的 .c 文件创建三个可执行文件。 我想创建 Lez4Es1、Lez4Es1v2 和 Lez4Es3 作为我在两个不同阶段编译和链接的可执行文件。 比如:

gcc -std=c99 -Wall -pedantic Lez4Es1.c -c
gcc -std=c99 -Wall -pedantic Lez4Es1.o -o Lez4Es1

gcc -std=c99 -Wall -pedantic Lez4Es1v2.c -c
gcc -std=c99 -Wall -pedantic Lez4Es1.v2 -o Lez4Es1v2

gcc -std=c99 -Wall -pedantic Lez4Es3.c -c
gcc -std=c99 -Wall -pedantic Lez4Es3.o -o Lez4Es3

我的解决方案

假设所有 .c 文件都在同一个目录中,我创建了这个 Makefile 但它不起作用:

CC      =   gcc

CFLAGS      +=  -std=c99 -Wall -pedantic -g

TARGETS     =   Lez4Es1     \
                Lez4Es1v2   \
                Lez4Es3     \

.PHONY: all clean cleanall  

% : %.o
    $(CC) $(CFLAGS)  $^ -o $@  

%.o : %.c
    $(CC) $(CFLAGS) -c $^

all : $(TARGETS)

clean : 
    -rm *.o *~ core

cleanall : 
    -rm *.o *.txt -f $(TARGETS) *~ core

问题

当我运行 $ make 它从 .c 文件而不是从 .o 创建可执行文件时,这是编译器的输出:

$ make
    gcc -std=c99 -Wall -pedantic -g    Lez4Es1.c   -o Lez4Es1
    gcc -std=c99 -Wall -pedantic -g    Lez4Es1v2.c   -o Lez4Es1v2
    gcc -std=c99 -Wall -pedantic -g    Lez4Es3.c   -o Lez4Es3

如何解决让他做我想做的事情? 有没有一种方法可以给可执行文件一个不同于 .o 文件的名称?

对不起,我的英语不好,如果我没有很好地解释它,我准备编辑它并给你更多细节,谢谢。

【问题讨论】:

  • 有一个内置规则可以从.c 文件创建可执行文件;它优先于您的规则。为什么需要更复杂的两阶段编译?您也可以将.o 文件列为目标吗?这可能有帮助,也可能没有帮助;它至少会为您提供您似乎想要的.o 文件。 (OBJECTS = $(TARGETS:=.o) 作为宏;在 all 依赖行上的 $(TARGETS) 之前添加 $(OBJECTS)
  • 我需要两阶段编译,因为这是大学的家庭作业。
  • 也许您可以使用make -r 来抑制内置规则。您可能需要添加 .SUFFIXES: .c .o 规则行。
  • 它使用 $ make -r 运行,不错的提示!但我需要以 $ make 的身份运行。 .SUFFIXES: .c .o 做什么?谢谢。
  • GNU make manualSuffix Rules 上有一个部分,其中记录了.SUFFIXES 的作用。您可能不需要使用模式样式的 % : %.o 规则。

标签: c makefile


【解决方案1】:

尝试删除从源文件创建可执行文件的内置规则:

% : %.c

(没有配方的模式规则会取消该规则)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多