Emalele1688
19-03-2012, 22:19
Salve a tutti:)
Premetto che conosco bene come si usa qmake, ma vorrei capire anche i makefile poichè vorrei metterci le mani sopra.
Il problema è il seguente:
Devo compilare un programma su diversi moduli (in questo esempio sono main.c e util.c) i quali sorgenti sono ubicati in una cartella src.
La situazione della directory è questa:
Programma
|__src
| |_main.c
| |_util.c
| |_makefile2
|
|__include
| |_util.h
|
|__bin
|
|_makefile
Il makefile è sulla prima directory, e chiama il makefile2 in src per compilare util.c e main.c.
E qui viè il problema del secolo: util.o e main.o mi vengono generati nella direcotry principale (sopra l'ho chiamata programma) dove è presente il primo makefile.
Anche se dovessi usare un solo makefile, come faccio a fargli capire che i file oggetto (util.o e main.o) devono andare in src e non nella directory dove parte il makefile?
Infati l'errore generato è:
gcc: error: src/main.o: File o directory non esistente
gcc: error: src/util.o: File o directory non esistente
Voi come scrivereste un makefile in una situazione del genere? (non che una normale situazione dove ogni cosa trova il suo posto)
Posto i due Makefile
Makefile
CC = gcc
SOURCE_PATH = src/
INCLUDE_PATH = include/
INCLUDE = -I$(INCLUDE_PATH)
OBJS = $(SOURCE_PATH)main.o $(SOURCE_PATH)util.o
BIN_PATH = bin/
BIN_NAME = somma
CC_BIN = -o $(BIN_PATH)$(BIN_NAME)
DEBUG = -g
CFLAGS = -Wall -c
$(BIN_PATH)$(BIN_NAME): $(OBJS)
$(CC) $(INCLUDE) $(DEBUG) $(OBJS) $(CC_BIN)
#Genera util.o
$(SOURCE_PATH)util.o: $(INCLUDE_PATH)util.h $(SOURCE_PATH)util.c
$(MAKE) -f src/Makefile2 util.o
#genera main.o
$(SOURCE_PATH)main.o: $(SOURCE_PATH)main.c
$(MAKE) -f src/Makefile2 main.o
CC = gcc
INCLUDE_PATH = include
INCLUDE = -I$(INCLUDE_PATH)
SOURCE_PATH = src/
DEBUG = -g
CFLAGS = -Wall -c
#Genera util.o
util.o: include/util.h src/util.c
$(CC) $(INCLUDE) $(DEBUG) $(CFLAGS) $(SOURCE_PATH)util.c
#genera main.o
main.o: src/main.c
$(CC) $(INCLUDE) $(DEBUG) $(CFLAGS) $(SOURCE_PATH)main.c
Premetto che conosco bene come si usa qmake, ma vorrei capire anche i makefile poichè vorrei metterci le mani sopra.
Il problema è il seguente:
Devo compilare un programma su diversi moduli (in questo esempio sono main.c e util.c) i quali sorgenti sono ubicati in una cartella src.
La situazione della directory è questa:
Programma
|__src
| |_main.c
| |_util.c
| |_makefile2
|
|__include
| |_util.h
|
|__bin
|
|_makefile
Il makefile è sulla prima directory, e chiama il makefile2 in src per compilare util.c e main.c.
E qui viè il problema del secolo: util.o e main.o mi vengono generati nella direcotry principale (sopra l'ho chiamata programma) dove è presente il primo makefile.
Anche se dovessi usare un solo makefile, come faccio a fargli capire che i file oggetto (util.o e main.o) devono andare in src e non nella directory dove parte il makefile?
Infati l'errore generato è:
gcc: error: src/main.o: File o directory non esistente
gcc: error: src/util.o: File o directory non esistente
Voi come scrivereste un makefile in una situazione del genere? (non che una normale situazione dove ogni cosa trova il suo posto)
Posto i due Makefile
Makefile
CC = gcc
SOURCE_PATH = src/
INCLUDE_PATH = include/
INCLUDE = -I$(INCLUDE_PATH)
OBJS = $(SOURCE_PATH)main.o $(SOURCE_PATH)util.o
BIN_PATH = bin/
BIN_NAME = somma
CC_BIN = -o $(BIN_PATH)$(BIN_NAME)
DEBUG = -g
CFLAGS = -Wall -c
$(BIN_PATH)$(BIN_NAME): $(OBJS)
$(CC) $(INCLUDE) $(DEBUG) $(OBJS) $(CC_BIN)
#Genera util.o
$(SOURCE_PATH)util.o: $(INCLUDE_PATH)util.h $(SOURCE_PATH)util.c
$(MAKE) -f src/Makefile2 util.o
#genera main.o
$(SOURCE_PATH)main.o: $(SOURCE_PATH)main.c
$(MAKE) -f src/Makefile2 main.o
CC = gcc
INCLUDE_PATH = include
INCLUDE = -I$(INCLUDE_PATH)
SOURCE_PATH = src/
DEBUG = -g
CFLAGS = -Wall -c
#Genera util.o
util.o: include/util.h src/util.c
$(CC) $(INCLUDE) $(DEBUG) $(CFLAGS) $(SOURCE_PATH)util.c
#genera main.o
main.o: src/main.c
$(CC) $(INCLUDE) $(DEBUG) $(CFLAGS) $(SOURCE_PATH)main.c