Creating makefile
Jonathan Berry
berryja at gmail.com
Sat Dec 11 22:09:30 UTC 2004
On Sat, 11 Dec 2004 13:19:45 +0800, Wilson Woon <thwoon2002 at gmail.com> wrote:
> Hi all...
>
> I have problem creating Makefile to compile my C program files. I have
> two .c and one .h files. Here's my Makefile..
>
> # use "gcc" to compile source files.
> CC = gcc
> # the linker is also "gcc". It might be something else with other compilers.
> LD = gcc
> # Compiler flags go here.
> CFLAGS = -g -Wall
> # Linker flags go here. Currently there aren't any, but if we'll switch to
> # code optimization, we might add "-s" here to strip debug info and symbols.
> LDFLAGS =
> # use this command to erase files.
> RM = /bin/rm -f
> # list of generated object files.
> OBJS = main.o action.o
> # program executable file name.
> PROG = result
>
> # top-level rule, to compile everything.
> all: $(PROG)
>
> # rule to link the program
> $(PROG): $(OBJS) \
> $(LD) $(OBJS) -o $(PROG)
>
> # now comes a meta-rule for compiling any "C" source file.
> %.o: %.c \
> $(CC) $(CFLAGS) -c $<
>
> # rule for cleaning re-compilable files.
> clean: \
> $(RM) $(PROG) $(OBJS)
>
> The main.c and action.c files compiled successfully. However the
> result execution file failed with make: *** No rule to make target
> `gcc', needed by `main.o'. Stop. error message.
>
> Can anyone help me?
>
> Thank you
I think the three "\" are giving you problems. This is used at the
end of a line to continue it on the next line, so it is as if the next
line is on the same line. The syntax should be
rule: dependencies
command1
command2
.....
Putting the "\" makes the first command part of the dependency lines.
Also, for the rule for compiling .c files, you can also use:
.c.o:
instead of
%.o: %.c
As Marvin suggested, you might want to not use as many variables. For
compiling a two source file program, all of this is a little
excessive. Though it is more general if you want to follow the same
form for bigger, more complex projects. For instance, you could use
the following for the Makefile:
CC= gcc -g -Wall
all: result
result: main.o action.o
<tab>$(CC) main.o action.o -o result
.c.o:
<tab>$(CC) -c $<
clean:
<tab>/bin/rm -f main.o action.o result
Of course, replace the "<tab>" with an actual tab. I can't get gmail
to place a tab in the email. But, removing the "\"s in your first one
should work.
Jonathan
More information about the fedora-list
mailing list