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后缀。)