2012-03-15 7 views
5

parte de mi makefile se parece a esto ...cómo suprimir "archivo enlazador sin usar" al compilar

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) 

que me da la siguiente advertencia sobre la compilación:

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 

ahora, sé que recibo esa advertencia porque definitivamente debería (¡la opción -c específicamente dice que no se vincule)! pero quiero apagarlo, sé que estoy vinculando demasiado y estoy de acuerdo con eso. ¿Cómo apago esa advertencia?

Respuesta

6

No puede desactivar la advertencia, excepto al no pasar esas banderas. No es que estés vinculando "demasiado", es que al dar -c no estás vinculando en todo. Las banderas que se supone que se pasan al enlazador mostrarán una advertencia si se les da un comando que no ejecuta el enlazador. Si no quieres esas advertencias, entonces no pases las banderas del enlazador a tu compilador. Separa tus banderas en tu archivo MAKE en dos variables diferentes: un conjunto que va al compilador y al vinculador (a menudo las personas usan CFLAGS para esto pero es solo una convención) y un conjunto que va solo al vinculador (a menudo LDFLAGS).

También no debe vincular en el destino all: tenga un destino separado para el ejecutable, de modo que si ejecuta make dos veces seguidas sin cambios, la segunda invocación no hará nada.

Y en POSIX, las opciones de comando generalmente no deben aparecer antes de los argumentos.

Y, por supuesto, el uso de reglas de patrones ayuda a evitar la redundancia.

Por ejemplo:

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

cuando los divido en '$ (ldflg)' y '$ (ccflg)', recibo un montón de advertencias después de 'g ++ -c glfuns.cpp -Wno-write-strings -O2 -Dvis' diciendo que ciertas cosas (GLUT_DOUBLE, por ejemplo) no se declararon en este ámbito. cuando compilo esa línea con ldflg y ccflg, sin embargo, se compila pero recibo esas advertencias. EDITAR: ¡tuve ccflg y ldflg mezclados! ¡Gracias! – drjrm3

+0

Tengo un problema similar: al pasar -Wl, -rpath-link a gcc. Es parte de nuestro CFLAGS, y nos llevaría un poco de trabajo volver a deshacernos de él. Sé que está mal, pero esperaba una solución rápida. ¡Arruine al CCG moderno por querer que todo sea correcto! (Eso es sarcasmo por cierto) –

0

-c significa que * no está enlazando *. Así que no pases el marco.

+1

Soy consciente, sé exactamente por qué está sucediendo, simplemente quiero suprimir la advertencia. – drjrm3

Cuestiones relacionadas