Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [c/c++]Opzione gcc

  1. #1
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352

    [c/c++]Opzione gcc

    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.

  2. #2
    puoi usare mv per spostare i file

    codice:
    DIR = ./../MiaDir 
    
    FILES = aaa.c bbb.c fff.c
    
    TARGET : $(FILES)
    	gcc -c $(FILES) 
    	mv $(patsubst %.c,%.o,$(FILES)) $(DIR)
    se devi compilare tutti i file c di una directory fai prima a
    usare i wildcard %.c, %.o e le regole $@ $<

    edit:
    mi ero dimenticato patsubst

  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Ok, penso che devo mettermi sotto a studiare per bene il manuale del make, patsubst e i wildcard che suggerivi sono validi per il make o sono veri e propri comandi di shell?


  4. #4
    patsubst e wildard sono funzioni del make
    http://www.gnu.org/software/make/man...ake.html#SEC32

    se devo compilare un progetto fatto di più file contenuti nella stessa directory uso questo makefile

    codice:
    CC = gcc
    CFLAGS = -g -Wall 
    
    progetto.exe: $(patsubst %.c,%.o,$(wildcard *.c))
    	$(CC) -o $@ $^
    	
    %.o : %.c
    	$(CC) $(CFLAGS) -c $<
    
    clean:
    	rm -f *.o
    se devo compilare tanti eseguibili quanti sono i file sorgenti (1 eseguibile per ogni sorgente, tipico di esercizi) uso questa variante

    codice:
    CC = gcc
    CFLAGS = -g -Wall 
    
    all: $(patsubst %.c,%.exe,$(wildcard *.c))
    
    %.exe: %.o
    	$(CC) -o $@ $<
    	
    %.o : %.c
    	$(CC) $(CFLAGS) -c $<
    
    clean:
    	rm -f *.o

    $@ si riferisce al nome del target
    $< si riferisce al singolo file di cui il target dipende
    $^ si riferisce a tutti i file di da cui il target dipende

    se ho un file chiamato test.c

    allora, data questa regola
    codice:
    %.exe: %.o
    	$(CC) -o $@ $<
    $@ è la stringa test.exe
    $< è la stringa test.o

  5. #5
    sembra aramaico antico

  6. #6
    Su Linux un Makefile semplice semplice è questo:

    all: file1.o file2.o file3.o
    gcc -o file file.o file2.o file3.o

    .c.o:
    gcc -g -c $<

    In pratica significa che di tutti i files .c vengono creati i rispettivi .o, precompilazione, dopo il tags all compila in un solo programma i files .o

    Più semplice di questo non so

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Grazie a tutti per le risposte, come dicevo mi studiero un po il make, ma quindi per quel che ne sapete un'opzione come quella che chiedevo io non è incorporata diretamente tra quelle del gcc?


  8. #8
    No, devi prima creare i .o e poi creare l'eseguibile

  9. #9
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da Lethalman
    No, devi prima creare i .o e poi creare l'eseguibile
    no, ma io non voglio creare l'eseguibile, io volevo solo creare i file .o in una directory A a partire da (alcuni) file .c contenuti in una directori B; lo so che potrei creare i .o e poi muoverli dove voglio, solo che mi sembrava strano che il gcc tra le centinaia di opzioni che offre non ne dia una per stabilire la cartella di output,


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.