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.oAdemás, si puede ayudar a mejorar el código, se lo agradecería mucho.
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 cleanEste 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 MakefileUn 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.oque 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.amyProgram 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 -lmsi 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 -lmTambié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 -lmsin 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 -lmy 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.