2012-03-15 12 views
5

parte del mio makefile si presenta così ...come sopprimere "il file linker non utilizzati" durante la compilazione

ifdef vis 
flg += -framework GLUT -framework OpenGL -Dvis 
obj += camfun.o glfuns.o 
endif 

...

all: driver.cpp header.h $(obj) 
    $(cc) -o $(exe) driver.cpp $(obj) $(flg) $(lib) 

funs.o: header.h funs.cpp 
    $(cc) -c funs.cpp $(flg) 

glfuns.o: header.h glfuns.cpp 
    $(cc) -c glfuns.cpp $(flg) 

camfun.o: header.h camfun.cpp 
    $(cc) -c camfun.cpp $(flg) 

che mi dà il seguente avviso su di compilazione:

g++ -c camfun.cpp -Wno-write-strings -O2 -framework GLUT -framework OpenGL -Dvis 
i686-apple-darwin10-g++-4.2.1: -framework: linker input file unused because linking not done 
i686-apple-darwin10-g++-4.2.1: GLUT: linker input file unused because linking not done 
i686-apple-darwin10-g++-4.2.1: -framework: linker input file unused because linking not done 
i686-apple-darwin10-g++-4.2.1: OpenGL: linker input file unused because linking not done 

ora, so che sto ottenendo che avviso perché ho sicuramente dovrebbe (l'opzione -c specificamente dice di non collegare)! ma voglio spegnerlo, so che sto collegando troppo e sto bene con quello. come posso disattivare questo avviso?

risposta

6

Non è possibile disattivare l'avviso, ad eccezione del fatto che non vengono trasmessi tali flag. Non è che stai collegando "troppo", è che dando -c non stai collegando a tutti. Qualsiasi flag che dovrebbe essere passato al linker mostrerà un avvertimento se gli dai un comando che non esegue il linker. Se non si desidera che tali avvisi, quindi non passare flag di linker al compilatore. Separa le tue bandiere nel tuo makefile in due variabili diverse: un set che va al compilatore e al linker (spesso le persone usano CFLAGS per questo ma è solo una convenzione) e un set che va solo al linker (spesso LDFLAGS).

Inoltre, non è necessario collegare il target all: avere un target separato per l'eseguibile in modo che se si esegue make due volte di seguito senza modifiche, la seconda invocazione non eseguirà nulla.

E in POSIX, le opzioni di comando devono generalmente venire prima degli argomenti non successivi.

E, naturalmente, l'utilizzo delle regole del modello aiuta a evitare la ridondanza.

Ad esempio:

ifdef vis 
ccflg += -Dvis 
ldflg += -framework GLUT -framework OpenGL 
obj += camfun.o glfuns.o 
endif 

...

all: $(exe) 

$(exe): driver.cpp header.h $(obj) 
     $(cc) -o $(exe) $(ccflg) $(ldflg) driver.cpp $(obj) $(lib) 

%.o: %.cpp header.h 
     $(cc) -c $(ccflg) $< 
+0

quando li divido in '$ (ldflg)' e '$ (ccflg)', ricevo un sacco di avvertimenti dopo 'g ++ -c glfuns.cpp -Wno-write-strings -O2 -Dvis' dicendo che certe cose (GLUT_DOUBLE, ad esempio) non sono stati dichiarati in questo ambito. quando compilo quella riga con ldflg e ccflg, però, compila ma ricevo quegli avvertimenti. EDIT: avevo ccflg e ldflg confusi! Grazie! – drjrm3

+0

Ho un problema simile: con passaggio -Wl, -rpath-link a gcc. Fa parte dei nostri CFLAG e ci vorrebbe un po 'di ri-lavoro per sbarazzarsi di. So che è sbagliato, ma speravo in una soluzione rapida. Bloccare il moderno GCC per volere che le cose siano corrette! (questo è sarcasmo BTW) –

0

-c significa che * non si sta collegando *. Quindi non passare -framework.

+1

Sono consapevole, so esattamente perché sta accadendo, voglio semplicemente eliminare l'avviso. – drjrm3

Problemi correlati