Проблема с makefile после переименования переменной - PullRequest
1 голос
/ 14 июня 2019

после изменения имени переменной в make-файл ее поведение резко изменилось.От неудачной компиляции до успешной.

Я перепробовал все - разные имена, добавляя различные дополнительные условия, но все безуспешно.

Версия 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.

Thisфайл исходного кода

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

Исходный (желательный) make-файл поведения:

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

Пожалуйста, кто-нибудь объяснит мне, почему после смены имени мы теряем флаги для строгого кода.

Спасибо за ваше время!

1 Ответ

2 голосов
/ 14 июня 2019

Ни одна из ваших целей не попадает в цель. Если вы посмотрите на вывод, вы заметите, что Checking... не печатается и Creating object... не печатается. Итак, ваша программа собирается с целью по умолчанию. Эта цель по умолчанию автоматически добавляет $(CFLAGS) и $(LDFLAGS) в строку сборки. Вот почему все перестало работать, когда вы переименовали LDFLAGS.

Кроме того, ваш make-файл в настоящее время пытается создать исполняемый файл для каждого отдельного файла .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 будет содержать список файлов .o, соответствующих каждому файлу .c. Это будет список зависимостей для двоичного файла и список объектов для связи. Цель для объектных файлов говорит, чтобы создать файл .o для каждого файла .c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...