Variables 重命名变量后makefile出现问题

Variables 重命名变量后makefile出现问题,variables,makefile,rename,behavior,Variables,Makefile,Rename,Behavior,将变量的名称更改为makefile后,其行为发生了巨大变化。从失败的编译到成功的编译 我尝试了一切——不同的名字,添加了各种附加条件,但都没有成功 make的版本: $make --version GNU Make 3.82 Built for x86_64-redhat-linux-gnu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http:

将变量的名称更改为makefile后,其行为发生了巨大变化。从失败的编译到成功的编译

我尝试了一切——不同的名字,添加了各种附加条件,但都没有成功

make的版本:

$make --version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
原始(所需)行为生成文件:

SHELL = /bin/sh
.SUFFIXES:
.SUFFIXES: .c .o

CC := gcc
LD := gcc

CFLAGS := -g

STRICT_CFLAGS := -Wall -Wextra -Wpedantic -Werror
INCLUDE_CFLAGS := 
ALL_CFLAGS := $(INCLUDE_CFLAGS) $(STRICT_CFLAGS) $(CFLAGS)


STRICT_LDFLAGS := -Wall -Wextra -Wpedantic -Werror
INCLUDE_LDFLAGS := 
LDFLAGS := $(STRICT_LDFLAGS) $(INCLUDE_LDFLAGS) $(CFLAGS)

SOURCES := $(wildcard *.c)
BINARIES := $(SOURCES:%.c=%)

.PHONY: all
all: $(BINARIES)

%: %.o
    @echo "Checking..."
    $(LD) $(LDFLAGS) -o $@

.c.o:
    @echo "Creating object..."
    $(CC) $(ALL_CFLAGS) -c $< -o $@

.PHONY: clean
clean:
    @echo "Cleaning up..."
    -rm -rvf *.o $(BINARIES)
重命名变量后生成文件(LDFLAGS->T_LDFLAGS)-错误行为:

SHELL = /bin/sh
.SUFFIXES:
.SUFFIXES: .c .o

CC := gcc
LD := gcc

CFLAGS := -g

STRICT_CFLAGS := -Wall -Wextra -Wpedantic -Werror
INCLUDE_CFLAGS := 
ALL_CFLAGS := $(INCLUDE_CFLAGS) $(STRICT_CFLAGS) $(CFLAGS)


STRICT_LDFLAGS := -Wall -Wextra -Wpedantic -Werror
INCLUDE_LDFLAGS := 
T_LDFLAGS := $(STRICT_LDFLAGS) $(INCLUDE_LDFLAGS) $(CFLAGS)

SOURCES := $(wildcard *.c)
BINARIES := $(SOURCES:%.c=%)

.PHONY: all
all: $(BINARIES)

%: %.o
    @echo "Checking..."
    $(LD) $(T_LDFLAGS) -o $@

.c.o:
    @echo "Creating object..."
    $(CC) $(ALL_CFLAGS) -c $< -o $@

.PHONY: clean
clean:
    @echo "Cleaning up..."
    -rm -rvf *.o $(BINARIES)
请有人向我解释一下,为什么在名称更改后,我们会丢失严格代码的标志


谢谢你的时间

你的两个make目标都没有被击中。如果查看输出,您会注意到,
检查…
未打印,
创建对象…
未打印。因此,正在使用默认目标构建程序。此默认目标自动将
$(CFLAGS)
$(LDFLAGS)
添加到生成行。这就是当您重命名
LDFLAGS
时事情停止工作的原因

此外,您的makefile当前正在尝试为每个.c文件创建一个可执行文件

您需要按以下方式更改您的目标:

SOURCES:=$(通配符*.c)
对象:=$(源:%.c=%.o)
二进制:=myprog
冒牌货:全部
全部:$(二进制)
$(二进制):$(对象)
@回声“检查…”
$(LD)$(T_LDFLAGS)$(对象)-o$@
%.o:%.c
@回显“正在创建对象…”
$(抄送)$(全部)-c$<-o$@

OBJECTS
变量将包含与每个.c文件对应的.o文件列表。这将是二进制文件的依赖项列表和要链接的对象列表。对象文件的目标是为每个.c文件创建一个.o文件

哇,10倍的数据包。。。非常感谢你的帮助,显然我还有很多东西要学。但正是这些问题帮助了我们——经过5-6个小时的研究和实验,问题没有解决,但学到了更多!行
$(二进制文件):$(二进制文件).o
是错误的,除非您的目录中只有一个源文件。只要你有多个,它就会严重损坏。@madscitist你说得对!你知道问题是什么,怎么解决吗?提前10倍!问题是:如果
BINARIES
包含
foobar
,那么上面的行将扩展到
foobar:foobar.o
,这显然是错误的。您不能只在变量末尾添加一个
.o
,然后以某种方式期望它应用于该变量中的每个单词。。。事实并非如此。它只是被附加到变量值的末尾。即使它确实被追加(假设您将其重写为
$(二进制文件):$(addsuffix.o,$(二进制文件))
这仍然是不对的:它会让每个二进制文件依赖于所有的目标文件。在我们帮助您之前,您需要澄清:目录中的每个
.c
文件是否真的编译成单独的程序?这就是您的语句
二进制文件:=$(源代码:%.c=%)
说。这很少见:通常一个程序是由多个源文件构建的。这个问题的答案对于什么是合理的解决方案有很大的不同。
$make
gcc -g  -Wall -Wextra -Wpedantic -Werror  -g  test.c   -o test
test.c: In function ‘main’:
test.c:1:14: error: unused parameter ‘argc’ [-Werror=unused-parameter]
} return 0;nt argc, char *argv[])
              ^
test.c:1:26: error: unused parameter ‘argv’ [-Werror=unused-parameter]
} return 0;nt argc, char *argv[])
                          ^
cc1: all warnings being treated as errors
make: *** [test] Error 1
SHELL = /bin/sh
.SUFFIXES:
.SUFFIXES: .c .o

CC := gcc
LD := gcc

CFLAGS := -g

STRICT_CFLAGS := -Wall -Wextra -Wpedantic -Werror
INCLUDE_CFLAGS := 
ALL_CFLAGS := $(INCLUDE_CFLAGS) $(STRICT_CFLAGS) $(CFLAGS)


STRICT_LDFLAGS := -Wall -Wextra -Wpedantic -Werror
INCLUDE_LDFLAGS := 
T_LDFLAGS := $(STRICT_LDFLAGS) $(INCLUDE_LDFLAGS) $(CFLAGS)

SOURCES := $(wildcard *.c)
BINARIES := $(SOURCES:%.c=%)

.PHONY: all
all: $(BINARIES)

%: %.o
    @echo "Checking..."
    $(LD) $(T_LDFLAGS) -o $@

.c.o:
    @echo "Creating object..."
    $(CC) $(ALL_CFLAGS) -c $< -o $@

.PHONY: clean
clean:
    @echo "Cleaning up..."
    -rm -rvf *.o $(BINARIES)
$make
gcc -g    test.c   -o test