es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

  1. Agrego esa línea main3 después de la línea de vínculo PROGS, entonces falla debido al archivo de objeto que falta.
  2. 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 regla PROGS 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.

Tags:  ,

Answer

  1. Avatar for 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:

    PROGS = main1 main2
    
    main3: lib.o
        ${MAKE} main3_bin
    
    main3_bin: main3.o lib.o
        ${CC} -o main3 main3.o lib.o
    
    ${PROGS} : $$@.o lib.o
        ${CC} -o $@ $^
    

    Aquí, creamos una nueva regla para main3, que primero llamará a main3_bin para construir el ejecutable con los archivos de objeto necesarios. Luego, modificamos la regla PROGS para incluir lib.o como un requisito previo para cada ejecutable. Esto asegura que todos los ejecutables, incluido main3, se construyan con lib.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 regla PROGS, ya que estamos usando expansión doble.

    Alternativamente, si desea mantener la regla main3 separada de la regla PROGS, podría modificar el archivo makefile de la siguiente manera:

    PROGS = main1 main2
    PROGS_WITH_LIB = main3
    
    ${PROGS} : $$@.o
        ${CC} -o $@ $@.o
    
    ${PROGS_WITH_LIB} : $$@.o lib.o
        ${CC} -o $@ $^
    
    lib.o:
        #regla para construir lib.o aquí
    

    Aquí, creamos una variable separada PROGS_WITH_LIB para definir los ejecutables que necesitan que lib.o se vincule. Luego, creamos una regla específica para ${PROGS_WITH_LIB} que incluye lib.o como un requisito previo. Finalmente, agregamos una regla para construir lib.o si aún no existe. De esta manera, puede mantener sus macros PROGS y PROGS_WITH_LIB separadas y aún asegurarse de que todos los ejecutables se construyan con los archivos de objeto necesarios vinculados.

Comments are closed.