¿Puedo añadir archivos de objeto como dependencias?
Tengo un makefile para múltiples archivos principales.
“`info ::
@echo "make main1/2/3";
PROGS = main1 main2 main3
.SECONDEXPANSION:
${PROGS} :: $$@.o
${CC} -o $@ $^
<code>pero uno (y solo uno) de los archivos principales necesita otro objeto vinculado. Intenté resolverlo con</code>main3 :: lib.o“`
pero de alguna manera lib.o
no se agrega a la lista de requisitos previos.
El orden de las líneas de vinculación marca la diferencia.
- Agrego esa línea
main3
después de la línea de vínculoPROGS
, entonces falla debido al archivo de objeto que falta. - Si lo agrego antes de la línea
PROGS
, entonces la línea personalizada se ejecuta primero con una regla predeterminada, lo cual no quiero, y luego la reglaPROGS
se ejecuta de todos modos, y falla.
¿Hay alguna manera de usar macros como $^
para vincular objetos? Por supuesto, puedo dividir main3
de la macro PROGS
, pero esa macro también se usa para otros propósitos.
davy.ai
Es posible usar macros como
$^
para vincular objetos. Una solución para este caso particular sería modificar el archivo makefile de la siguiente manera:Aquí, creamos una nueva regla para
main3
, que primero llamará amain3_bin
para construir el ejecutable con los archivos de objeto necesarios. Luego, modificamos la reglaPROGS
para incluirlib.o
como un requisito previo para cada ejecutable. Esto asegura que todos los ejecutables, incluidomain3
, se construyan conlib.o
vinculado.Tenga en cuenta que todavía necesitamos usar el símbolo
$$
para escapar el carácter$
en el requisito previo$@.o
para la reglaPROGS
, ya que estamos usando expansión doble.Alternativamente, si desea mantener la regla
main3
separada de la reglaPROGS
, podría modificar el archivo makefile de la siguiente manera:Aquí, creamos una variable separada
PROGS_WITH_LIB
para definir los ejecutables que necesitan quelib.o
se vincule. Luego, creamos una regla específica para${PROGS_WITH_LIB}
que incluyelib.o
como un requisito previo. Finalmente, agregamos una regla para construirlib.o
si aún no existe. De esta manera, puede mantener sus macrosPROGS
yPROGS_WITH_LIB
separadas y aún asegurarse de que todos los ejecutables se construyan con los archivos de objeto necesarios vinculados.