我在使用 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。
但是,我被告知要使用makefile。这是我的制作文件:
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
使用上面的制作文件,我得到以下错误。我的理解是 -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
并且上述规则将自动应用。将生成文件重构为此将更容易发现错误:)
都不想在编译命令中LFLAGS
- 把-std=c99
放在CFLAGS
- 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
(我还添加了马格努斯指出的缺失的.o后缀。