PDA

View Full Version : [Urgente] Opzione gcc


anx721
09-06-2004, 15:56
Salve a tutti,

nella documentazione del gcc non riesco a trovare l'opzione per scegliere la directory in cui collocare il file risultante dalla compilazione, lo so che si puo usare l'opzione -o

gcc -c file.c -o ./bla/bla/bla/file.o

pero io devo compilare insieme più file, quindi non posso usare l'opzione -o, siccome il comando di trova in un makefile, non conosco a priori quali sono i file che compilo, i loro nomi si trovano in una varibile, diciamo FILES:

FILES = aaa.c bbb.c fff.c

TARGET : $(FILES)
...............gcc -c $(FILES)

per ora ho fatto cosi, pero in questo modo mi colloca i file .o prodotti nella directory corrente, mentre io li vorrei in un'altra directory, diciamo DIR = ./../MiaDir

come faccio?

Grazie e ciao.

ilsensine
10-06-2004, 13:13
Boh non sono un guru dei Makefile, ma un modo (non molto corretto) è il seguente:

# Gli object ricavati dai file .c
OBJS := a.o b.o
# Directory dove mettere gli object
BDIR := build
# il nome dell'eseguibile
TGT := test
# Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS)
CFLAGS := -O2

all: ${TGT}

${TGT}:
objs=""; \
for obj in ${OBJS}; do \
fc=`echo $$obj | sed s/\.o/\.c/`; \
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \
objs=$$objs\ ${BDIR}/$$obj; \
done; \
${CC} -o $@ $$objs ${LDFLAGS} || exit 1;

anx721
12-06-2004, 18:24
grazie ;)

anche se avrei preferito che il gcc metteesse a disposizione già da sè l'opzione di cui avevo bisogno, visto che offre centinaia di opzioni.

Vincenzo1968
08-01-2013, 12:32
Come faccio a creare la directory se non esiste?

Ho provato così:


# Gli object ricavati dai file .c
OBJS := main.o ast.o endianess.o jvm.o parser.o scanner.o symtab.o
# Directory dove mettere gli object
BDIR := ObjDir
# il nome dell'eseguibile
TGT := Contest1464
# Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS)
CFLAGS := -m64 -O2
CC = gcc

all: ${TGT}

${TGT}:
mkdir %{BDIR} \
objs=""; \
for obj in ${OBJS}; do \
fc=`echo $$obj | sed s/\.o/\.c/`; \
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \
objs=$$objs\ ${BDIR}/$$obj; \
done; \
${CC} -o $@ $$objs ${LDFLAGS} || exit 1;


ma non funziona. Vengono create due directory: "objs=" e "%{BDIR}" al posto di "ObjDir".

E naturalmente viene generato il messaggio d'errore:


Assembler messages:
Fatal error: can't create ObjDir/main.o: File o directory non esistente
make: *** [Contest1464] Errore 1

Vincenzo1968
08-01-2013, 12:55
Risolto:

http://img51.imageshack.us/img51/4025/makefilerisolto.jpg

:yeah: :winner: :yeah:

Avevo digitato % al posto di $ :D

E ho modificato Makefile così:


# Gli object ricavati dai file .c
OBJS := main.o ast.o endianess.o jvm.o parser.o scanner.o symtab.o
# Directory dove mettere gli object
BDIR := ObjDir
# il nome dell'eseguibile
TGT := Contest1464
# Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS)
CFLAGS := -m64 -O2
CC = gcc

all: createobjdir ${TGT}

${TGT}:
objs=""; \
for obj in ${OBJS}; do \
fc=`echo $$obj | sed s/\.o/\.c/`; \
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \
objs=$$objs\ ${BDIR}/$$obj; \
done; \
${CC} -o $@ $$objs ${LDFLAGS} || exit 1;

createobjdir:
-mkdir ${BDIR}

Vincenzo1968
08-01-2013, 13:00
Adesso però ho il problema di ignorare il comando mkdir se la directory già esiste:


mkdir ObjDir
mkdir: impossibile creare la directory "ObjDir": File già esistente
make: [createobjdir] Errore 1 (ignorato)


Come si fa? :confused:

EDIT: Risolto:


# Gli object ricavati dai file .c
OBJS := main.o ast.o endianess.o jvm.o parser.o scanner.o symtab.o
# Directory dove mettere gli object
BDIR := ObjDir
# il nome dell'eseguibile
TGT := Contest1464
# Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS)
CFLAGS := -m64 -O2
CC = gcc

all: createobjdir ${TGT}

${TGT}:
objs=""; \
for obj in ${OBJS}; do \
fc=`echo $$obj | sed s/\.o/\.c/`; \
${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \
objs=$$objs\ ${BDIR}/$$obj; \
done; \
${CC} -o $@ $$objs ${LDFLAGS} || exit 1;

createobjdir:
-mkdir -p -v ${BDIR}


si usa l'opzione -p sul comando mkdir.

Vincenzo1968
08-01-2013, 14:29
Certo che è una forza 'sta shell programmabile di Linux. :D

E anche il comando make è una potenza. Si possono automatizzare molti task. Non serve soltanto per creare gli eseguibili a partire dai sorgenti C.

Sempre più felice di avere scoperto Linux. :D