GCC makefile不接受-std = c99 -lm

我用gcc编译器的makefile有问题。 如果我直接使用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。

但是,我被告知使用makefile。 这是我的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 

我建议重构你的makefile,所以你有一个通用规则来编译.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 – 在CFLAGS放置-std=c99 – makefile应该更像这样:

 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 

(我还添加了Magnus指出的缺失的.o后缀。)