重命名变量后生成文件的问题

Problem with makefile after rename variable

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

我什么都试过了——不同的名字,添加各种附加条件,但都没有成功。

制作版本:

$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.

这是一个源代码文件

int main(int argc, char *argv[])
{
        return 0;
}

原始(期望的)行为 makefile:

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)

编译输出:

$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

重命名变量后的 Makefile (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
gcc -g    test.c   -o test

请有人向我解释一下为什么在名称更改后我们失去了严格代码的标志。

感谢您的宝贵时间!

您的两个 make 目标都没有被命中。如果您查看输出,您会注意到 Checking...Creating object... 都没有打印出来。所以你的程序是用默认目标构建的。此默认目标会自动将 $(CFLAGS)$(LDFLAGS) 添加到构建行。这就是当您重命名 LDFLAGS.

时一切停止工作的原因

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

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

SOURCES := $(wildcard *.c)
OBJECTS := $(SOURCES:%.c=%.o)
BINARY := myprog

.PHONY: all
all: $(BINARY)

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

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

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