GCC makefile не принимает -std = c99 -lm

У меня возникла проблема с моим make-файлом с помощью gcc-компилятора. Если я использую gcc непосредственно как:

gcc -std=c99 -lm tm.c tm_coins.c tm_options.c tm_stock.c tm_utility.c -o tm -Wall -pedantic 

Все работает нормально. Мне нужны -std-c99 и -lm.

Тем не менее, мне сказали использовать make-файл. Вот мой файл make:

 CFLAGS=-ansi -Wall -pedantic LFLAGS=-std=c99 -lm CC=gcc all:tm tm:tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o $(CC) $(LFLAGS) tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o -o tm $(CFLAGS) tm.o: tm.h tm.c $(CC) $(LFLAGS) $(CFLAGS) -c tm.c tm_coins.o:tm_coins.h tm_coins.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_coins.c tm_options:tm_options.h tm_options.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_options.c tm_stock:tm_stock.h tm_stock.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_stock.c tm_utility:tm_utility.h tm_utility.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_utility.c 

С выше makefile я получаю ниже ошибок. Я понимаю, что -std = c99 и -lm не работают. (посмотрите на первую строчку ниже. -std = c99 и -lm там нет)

 gcc -ansi -Wall -pedantic -c -o tm_options.o tm_options.c tm_options.c: In function 'purchase_ticket': tm_options.c:37: error: expected expression before '/' token tm_options.c:52: error: expected expression before '/' token tm_options.c:102: warning: ISO C90 forbids mixed declarations and code tm_options.c: In function 'display_tickets': tm_options.c:239: error: expected expression before '/' token tm_options.c: In function 'add_ticket': tm_options.c:285: error: expected expression before '/' token tm_options.c:303: error: expected expression before '/' token tm_options.c:314: warning: ISO C90 forbids mixed declarations and code tm_options.c: In function 'delete_ticket': tm_options.c:387: error: expected expression before '/' token tm_options.c:405: error: expected expression before '/' token tm_options.c: In function 'display_coins': tm_options.c:461: error: expected expression before '/' token tm_options.c: In function 'restock_tickets': tm_options.c:501: error: expected expression before '/' token tm_options.c: In function 'restock_coins': tm_options.c:526: error: expected expression before '/' token tm_options.c: In function 'save_data': tm_options.c:555: warning: ISO C90 forbids mixed declarations and code 

Где ошибка? Заранее спасибо.

Для следующих трех правил вы забыли суффикс .o для своих целей:

 tm_options:tm_options.h tm_options.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_options.c tm_stock:tm_stock.h tm_stock.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_stock.c tm_utility:tm_utility.h tm_utility.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_utility.c 

Вот почему правила, которые вы написали, не применяются. Вместо этого он возвращается к правилу по умолчанию для компиляции источников .c в .o .

Вы хотели включить его так:

 tm_options.o:tm_options.h tm_options.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_options.c tm_stock.o:tm_stock.h tm_stock.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_stock.c tm_utility.o:tm_utility.h tm_utility.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_utility.c 

Я рекомендую рефакторинг вашего make-файла, поэтому у вас есть общее правило для компиляции .c в .o :

 %.o: %.c $(CC) $(CFLAGS) -o %@ -c %< 

Затем вам нужно только указать зависимости для ваших файлов:

 tm_options.o: tm_options.h tm_options.c tm_stock.o: tm_stock.h tm_stock.c tm_utility.o: tm_utility.h tm_utility.c 

и указанное правило применяется автоматически. Рефакторинг вашего файла makefile позволит вам обнаружить ошибки 🙂

Вы не хотите, чтобы LFLAGS в командах компиляции – put -std=c99 в CFLAGS – make-файл должен быть примерно таким:

 CFLAGS = -ansi -Wall -pedantic -std=c99 LFLAGS = -lm CC = gcc all: tm tm: tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o $(CC) $(LFLAGS) tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o -o tm tm.o: tm.h tm.c $(CC) $(CFLAGS) -c tm.c tm_coins.o: tm_coins.h tm_coins.c $(CC) $(CFLAGS) -c tm_coins.c tm_options.o: tm_options.h tm_options.c $(CC) $(CFLAGS) -c tm_options.c tm_stock.o: tm_stock.h tm_stock.c $(CC) $(CFLAGS) -c tm_stock.c tm_utility.o: tm_utility.h tm_utility.c $(CC) $(CFLAGS) -c tm_utility.c 

(Я также добавил отсутствующие суффиксы .o, как указал Магнус.)