Tengo 4 archivos: 1.c, 1.h, 2.c, 2.h.
Necesito un makefile, que va a crear una librería dinámica (.así que) a partir de los 4 archivos.
He tratado de escribir un makefile como este:

de la biblioteca.así : 1.c 1.h 2.c 2.h

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

  • Son archivos de encabezado – no parte de una .así de archivo
  • entonces, ¿cómo debe mi makefile parece?
InformationsquelleAutor user2581733 | 2014-11-01

3 Comentarios

  1. 3

    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 [email protected]
    
     1.o: 1.c 1.h 2.h
    
     2.o: 2.c 1.h 2.h

    Pero esto no está probado! Estoy asumiendo Linux con GNU make, y un directorio que contiene sólo el código fuente de la biblioteca (con el anterior Makefile), que podría ser una mala práctica que usted puede ser que desee un caso de prueba- (usted podría tener un especial Makefile regla para %.pic.o dependiendo de %.c, etc…)

    Consejos: use make -p a entender el grupo builtin reglas. Luego make --trace o (con remake) remake -x a entender un poco más lo que make está haciendo.

    Leer también Drepper del papel: Cómo Escribir las Bibliotecas Compartidas, documentación de GNU make, Programa De La Biblioteca HowTo, esta respuesta, …

  2. 4

    La forma más sencilla es:

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

    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)
    • No utilice $(shell echo ./*.c) pero sólo $(wildcard *.c)
    • bueno, muchas gracias, deseo que podría aumentar su reputación, pero yo por desgracia de los que no puedo porque soy demasiado nuevo 🙁
  3. 2
    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 [email protected] $^       # -o [email protected] says, put the output of the compilation in the file named on the left side of the :
    
    $(SRCS:.c=.d):%.d:%.c
            $(CC) $(CFLAGS) -MM $< >[email protected]      # 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. Tenemos que instalarlo.

    Convertirse en usuario root.

    Copia de la biblioteca compartida en el directorio estándar «/usr/lib«.

    Ejecutar ldcofig comando.

    Volver a compilar el .c archivo con la biblioteca compartida.
    [email protected]:~/C/SharedLibrary# gcc-c main.c
    [email protected]:~/C/SharedLibrary# gcc-o principal.o sh_main.así

    [email protected]:~/C/SharedLibrary# ldd principal

    Nota: En mi caso.

    principal.c: principal C archivo

    sh_main.así: de la biblioteca compartida.

    • ¿Por qué volver a compilar? Es sólo debido a que /usr/lib es normalmente chown había root? O es porque…En cualquier caso, esto sirvió como éxito de la plantilla para el mismo problema. No he hecho la recompilar todavía.

Dejar respuesta

Please enter your comment!
Please enter your name here