Używam prostego Makefile bez problemów:Makefile reguła podkatalogu C aby OBJ
CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o
%.o: %.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o [email protected] $^ $(CFLAGS)
Pliki są w katalogu głównego projektu:
./project/Makefile
./project/hellomake.c
./project/hellomake.h
Potem próbowałem zorganizowany plików i umieścić rzeczy jak:
./project/Makefile
./project/src/hellomake.c
./project/include/hellomake.h
i dodatkowych podkatalogach katalogów:
./project/lib
./project/obj
Potem nowa wersja Makefile:
IDIR =include
CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I$(IDIR)
ODIR=obj
LDIR =lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o [email protected] $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o [email protected] $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
Mam kompilacji na systemie Linux za pomocą Emacsa z kompilatora gcc:
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Potem biegnę na Emacs:
<Esc>
x
compile
make
I daje komunikat:
"./project/src/" -*-
make: *** No rule to make target `obj/hellomake.o', needed by `hellomake'. Stop.
Compilation exited abnormally with code 2 at Wed Oct 3 17:10:01
Jakiej zasady powinna brakować w pliku Makefile?
Wszystkie komentarze i sugestie są wysoko cenione.
Dzięki za sugestię, jest ona dodawana do kodu. Następnie kompilator narzeka:
make -k
make: *** No rule to make target `src/hellomake.c', needed by `obj/hellomake.o'.
make: *** No rule to make target `../include/hellomake.h', needed by `obj/hellomake.o'.
make: Target `obj/hellomake.o' not remade because of errors
Jakieś inne sugestie?
Z góry dziękuję!
'project/obj' byłoby odrobinę bardziej sensowne niż' project/src/obj' –
Witaj, Steve-o. Dzięki! Wprowadziłem zmianę, którą zasugerowałeś. – ThreaderSlash