makefile para crear (.so) archivo de archivos existentes

Tengo 4 archivos: 1.c , 1.h , 2.c , 2.h. Necesito un makefile, que creará una biblioteca dinámica (.so) de esos 4 archivos. He intentado escribir un makefile como este:

biblioteca.so: 1.c 1.h 2.c 2.h

Pero no funcionó. Sería genial, si alguien me ayuda, gracias.

Algo como

CC=gcc CFLAGS= -Wall -g -O -fPIC RM= rm -f .PHONY: all clean all: library.so clean: $(RM) *.o *.so library.so: 1.o 2.o $(LINK.c) -shared $< -o $@ 1.o: 1.c 1.h 2.h 2.o: 2.c 1.h 2.h 

¡Pero esto no está probado! Asumo que Linux con GNU make , y un directorio que contiene solo el código fuente de su biblioteca (con el Makefile anterior), lo que podría ser una mala práctica (es posible que desee un caso de prueba) (podría tener una regla especial de Makefile para %.pic.o dependiendo de %.c , etc ...)

Sugerencias: use make -p para comprender las reglas integradas. Luego make --trace o (con una nueva versión ) remake -x para comprender un poco más lo make hace make .

Lea también el artículo de Drepper: Cómo escribir bibliotecas compartidas , documentación de GNU make , Program Library HowTo , esta respuesta , ...

La forma más sencilla es:

 CXXFLAGS += -fPIC CXXFLAGS += -O3 x.so: 1.o 2.o $(LINK.cc) -shared $^ $(LOADLIBS) $(LDLIBS) -o $@ 

Un poco más avanzado:

 CC = gcc FLAGS = # -std=gnu99 -Iinclude CFLAGS = -fPIC -g #-pedantic -Wall -Wextra -ggdb3 LDFLAGS = -shared DEBUGFLAGS = -O0 -D _DEBUG RELEASEFLAGS = -O2 -D NDEBUG -combine -fwhole-program TARGET = example.so SOURCES = $(wildcard *.c) HEADERS = $(wildcard *.h) OBJECTS = $(SOURCES:.c=.o) all: $(TARGET) $(TARGET): $(OBJECTS) $(CC) $(FLAGS) $(CFLAGS) $(DEBUGFLAGS) -o $(TARGET) $(OBJECTS) 
 CC = gcc # C compiler CFLAGS = -fPIC -Wall -Wextra -g # C flags LDFLAGS = -shared # linking flags RM = rm -f # rm command TARGET_LIB = sh_main.so # target lib SRCS = add.c sub.c main.c # source file DEPS = header.h # header file OBJS = $(SRCS:.c=.o) # object file .PHONY: all all: ${TARGET_LIB} $(TARGET_LIB): $(OBJS) $(CC) ${LDFLAGS} -o $@ $^ # -o $@ says, put the output of the comstacktion in the file named on the left side of the : $(SRCS:.c=.d):%.d:%.c $(CC) $(CFLAGS) -MM $< >$@ # the $< is the first item in the dependencies list, and the CFLAGS macro is defined as above include $(SRCS:.c=.d) .PHONY: clean clean: -${RM} ${TARGET_LIB} ${OBJS} $(SRCS:.c=.d) 

Después de la biblioteca compartida creado con éxito. Necesitamos instalarlo.
Conviértete en el usuario root.
Copie la biblioteca compartida en el directorio estándar " / usr / lib ".
Ejecuta el comando ldcofig .

Recomstack tu archivo .c con la biblioteca compartida. root @ Admin: ~ / C / SharedLibrary # gcc -c main.c root @ Admin: ~ / C / SharedLibrary # gcc -o main main.o sh_main.so

root @ Admin: ~ / C / SharedLibrary # ldd main

Nota: En mi caso.
main.c: archivo principal de C
sh_main.so: biblioteca compartida.