问题
I am having problem with my makefile with gcc compiler. If I use gcc directly as:
gcc -std=c99 -lm tm.c tm_coins.c tm_options.c tm_stock.c tm_utility.c -o tm -Wall -pedantic
Everything works fine. I need -std-c99 and -lm.
However, I have been told to use makefile. Here is my make file:
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
With above makefile I get below errors. My understanding is that -std=c99 and -lm doesn't work. (look at the first line below. -std=c99 and -lm are not there)
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
Where would be the error? Thanks in advance.
回答1:
For the following three rules, you have forgotten the .o suffix on your targets:
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
This is why the rules you have written do not apply. Instead, it falls back to the default rule for compiling .c sources into .o.
You meant to include it, like so:
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
I recommend refactoring your makefile, so you have a generic rule for compiling .c to .o:
%.o: %.c
$(CC) $(CFLAGS) -o %@ -c %<
Then, you only need to specify the dependencies for your files:
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
and the above rule is applied automatically. Refactoring your makefile to this will make it easier to spot errors :)
回答2:
You don't want LFLAGS in the compile commands anyway - put -std=c99 in CFLAGS - the makefile should be more like this:
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
(I've also added the missing .o suffixes as pointed out by Magnus.)
来源:https://stackoverflow.com/questions/19976302/gcc-makefile-doesnt-accept-std-c99-lm