Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

511
Vistas
C: Creación de una biblioteca estática y vinculación mediante un Makefile

Estoy tratando de entender las bibliotecas estáticas y compartidas .

Quiero hacer lo siguiente para crear un archivo MAKE que separe la compilación y la vinculación de modo que se cree una biblioteca estática y se vincule para formar el ejecutable estático final.

Tengo el siguiente código para Makefile, pero recibo el siguiente error

Makefile:13: *** missing separator. Stop.

Pero también estoy tratando de entender cómo vincular/crear bibliotecas.

Si ejecuto los comandos después de la line 12 en la terminal, funcionan, pero no en el archivo MAKE.

 myProgram: main.o addSorted.o freeLinks.o gcc -lm -o myProgram main.o addSorted.o freeLinks.o main.o: main.c gcc -O -c -lm main.c main.h addSorted.o: addSorted.c addSorted.h gcc -O -c -lm addSorted.c freeLinks.o: freeLinks.c freeLinks.h gcc -O -c -lm freeLinks.c ar rc libmylib.a main.o addSorted.o freeLinks.o //Error Line ranlib libmylib.a gcc -o foo -L. -lmylib foo.o clean: rm -f myProgram main.o addSorted.o freeLinks.o

Además, si puede ayudar a mejorar el código, se lo agradecería mucho.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Prueba esto:

 all: myProgram myProgram: main.o libmylib.a #libmylib.a is the dependency for the executable gcc -lm -o myProgram main.o -L. -lmylib main.o: main.c gcc -O -c main.c main.h addSorted.o: addSorted.c addSorted.h gcc -O -c addSorted.c freeLinks.o: freeLinks.c freeLinks.h gcc -O -c freeLinks.c libmylib.a: addSorted.o freeLinks.o #let's link library files into a static library ar rcs libmylib.a addSorted.o freeLinks.o libs: libmylib.a clean: rm -f myProgram *.o *.a *.gch #This way is cleaner than your clean

Este conjunto de reglas primero compila todos los archivos, luego hace que la biblioteca (libmylib.a) sea el objetivo y usa su artefacto para vincular el ejecutable. También agregué un formulario de destino redundante separado haciendo solo libs. Archivos necesarios:

 user@host> ls addSorted.c addSorted.h freeLinks.c freeLinks.h main.c main.h Makefile
over 4 years ago · Santiago Trujillo Denunciar

0

Un archivo MAKE no es un script de shell. Es un archivo de configuración para un sistema experto. Específicamente, un sistema experto que sabe, si se lo dice, cómo crear archivos de manera eficiente y sus dependencias con un mínimo de rehacer archivos que no necesitan ser rehechos.

Si observas la primera regla tienes:

 myProgram: main.o addSorted.o freeLinks.o gcc -lm -o myProgram main.o addSorted.o freeLinks.o

que le dice al sistema cómo hacer un archivo llamado "myProgram" si decide que necesita hacer eso. Las partes después de los dos puntos son archivos que necesita myProgram. Si no están ahí, o make decide que están desactualizados, make intentará encontrar alguna receta que pueda usarse para crearlos o actualizarlos. Una vez hecho todo eso, make ejecuta la línea "gcc ..." y asume que creará o actualizará myProgram.

Las líneas ar y ranlib que tiene no coinciden con la sintaxis necesaria para una regla de archivo MAKE. Por su apariencia, parecen ser una receta para hacer libmylib.a. Si los pones en la sintaxis make necesita decir eso, obtienes:

 libmylib.a: main.o addSorted.o freeLinks.o ar rcu libmylib.a main.o addSorted.o freeLinks.o ranlib libmylib.a

myProgram debe depender de la biblioteca en sí, en lugar de los contenidos de la biblioteca, y es mejor poner las opciones de la biblioteca al final:

 myProgram: libmylib.a gcc -o myProgram libmylib.a -lm

si lo desea, puede usar una opción para decirle a gcc que busque bibliotecas en el directorio actual:

 gcc -L. -o myProgram main.o -lmylib -lm

También hay variables de archivo MAKE que pueden ayudarlo a no tener que repetir tanto, por lo que escribiría la primera regla como:

 myProgram: libmylib.a gcc -L. -o $@ -lmylib -lm

sin embargo, es poco probable que main.o sea realmente parte de la biblioteca, por lo que:

 myProgram: main.o libmylib.a gcc -L. -o $@ $< -lmylib -lm

y la regla de la biblioteca como:

 libmylib.a: addSorted.o freeLinks.o ar rcu $@ $+ ranlib $@

el $+ aquí significa "todos los nombres de archivos de dependencia".

Finalmente, si desea que gcc cree un ejecutable estático real, y no solo use la biblioteca que creó, debe pasar la opción '-static' a gcc.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda