He creado un archivo makefile para compilar y vincular mi programa, sin embargo, no puedo entender ¿por qué estoy recibiendo este error. Tiene que ver con SDL?

GCC = gcc
CFLAGS = -c -std=c99 -lm -Wall -Wextra -pedantic -O3 -Wfloat-equal -g
SDL = -lSDL2 -lSDL2_ttf -lSDL2_image -lSDL2_mixer

all: ./game

game: global.o display.o player.o entities.o controls.o sound.o menu.o
    $(GCC) $(CFLAGS) global.o display.o player.o entities.o controls.o sound.o menu.o -o game

global.o: global.c
    $(GCC) $(CFLAGS) $(SDL) global.c

display.o: display.c
    $(GCC) $(CFLAGS) $(SDL) display.c

player.o: player.c
    $(GCC) $(CFLAGS) $(SDL) player.c

entities.o: entities.c
    $(GCC) $(CFLAGS) $(SDL) entities.c

controls.o: controls.c
    $(GCC) $(CFLAGS) $(SDL) controls.c

sound.o: sound.c
    $(GCC) $(CFLAGS) $(SDL) sound.c

menu.o: menu.c
    $(GCC) $(CFLAGS) $(SDL) menu.c

clean:
    rm *o game
Su CFLAGS ha -c en ella. Lo que significa compilar pero no el enlace. Y usted está usando esas banderas en la regla para el game objetivo que se supone enlace.
Usted no necesita la $(SDL) macro cuando se compila el objeto de archivos; sólo especifica las bibliotecas. Usted no necesita la $(SDL) macro en la línea de comandos de su vinculación comando. Usted necesita un macro como OBJECTS = global.o display.o player.o entities.o controls.o sound.o menu.o que usted puede utilizar en su enlace de las dependencias, y en el comando link, que probablemente deberían ser $(CC) -o [email protected] $(CFLAGS) $(OBJECTS) $(LDFLAGS) $(LDLIBS) donde LDFLAGS podría especificar -L/usr/local/sdl/lib y LDLIBS incluiría $(SDL) y la -lm opción también. El CFLAGS macro no debe incluir -c.

OriginalEl autor liamw9 | 2015-12-22

3 Comentarios

  1. 4

    hay varios pequeños descuidos en la publicación de makefile.

    Entre ellos:

    1. nombres de biblioteca sólo se utilizan durante el enlace paso, no el paso de compilación
    2. sugieren el uso de la ‘comodín’ hacer del operador para obtener una lista de los archivos de origen. A continuación, utilice un patterm sustitución del operador para obtener una lista de los archivos objeto:

    por ejemplo:

    SRC := $(wildcard *.c)
    OBJ := $(SRC:.c=.o)
    1. cuando un objetivo (todo limpio) no producen un archivo con el mismo nombre, a continuación, inserte un .PHONY: declaración de principios en la marca de archivo:

    de manera similar a:

    .PHONY : all clean
    1. publicado el archivo no tiene instalaciones para manejar la asociada archivos de encabezado, Hay varias maneras de manejar eso. De esta manera se sigue la OPs plomo y no se ocupa de los archivos de encabezado, por lo que cambiar un archivo de encabezado no va a compilar y vincular las efectuadas archivos de origen.

    2. esta línea: rm *o game no quitar el nombre.o los archivos, ya que falta el ‘.’ entre la raíz del nombre y el ‘o extensión. También, la ‘f’ de la bandera debe ser utilizado con el ‘rm’ comando.

    sugieren:

    rm -f *.o game 
    1. esta línea: all: ./game puede crear problemas

    sugieren:

    all: game
    1. una vez que la lista de archivos de objeto es creado (como el anterior), entonces la compilación de reglas puede ser reducido:

    mediante el uso de los operarios:

    %.o: %.c
        $(CC) $(CFLAGS) -c $< -o [email protected] -I.
    1. la -g parámetro para el compilador y el enlazador permite un depurador para ser utilizado. Si el depurador de gdb, a continuación, un mejor parámetro es -ggdb

    2. casi siempre, no es necesario para evaluar una definición de macro más de una vez, así que en lugar de utilizar = en una definición de macro, utilice :=

    3. Si quieres la game a ser ejecutable, a continuación, inserte un chmod de comandos como la última línea en el ‘link’ regla

    Sugerimos leer acerca de los operadores especiales que pueden ser empleadas en un makefile para ayudarle a entender el siguiente, sugirió makefile

    Es generalmente mejor para reemplazar las llamadas a la shell de comandos reconocidos con macros.

    CC := /user/bin/gcc
    RM := /usr/bin/rm
    
    CFLAGS := -c -std=c99 -Wall -Wextra -pedantic -O3 -Wfloat-equal -ggdb
    LFLAGS := -std=c99 -O3 -ggdb
    
    SDL := -lSDL2 -lSDL2_ttf -lSDL2_image -lSDL2_mixer
    
    SRC := $(wildcard *.c)
    OBJS := $(SRC:.c=.o)
    
    
    .PHONY : all clean
    all: game
    
    
    game: $(OBJS)
        $(CC) $(LFLAGS)  $(OBJS) -o [email protected] $(SDL) -lm
    
    %.o: %.c
        $(CC) $(CFLAGS) -c $< -o [email protected] -I.
    
    
    clean:
        $(RM) -f *.o game
    Gracias. Yo había intentado siguientes tutoriales y hubo varias cosas que yo no entendía. Ha autorizado para mí
    el mensaje de error de la OP recibió significa que el vínculo de paso no se realizó. No fue realizado debido a los varios ‘uy’ en la OPs publicado makefile.
    Downvoting porque su final Makefile tiene varias malas prácticas: codificar RM y CC, no hacer uso de la incorporada en las reglas, pasando de enlace banderas en codificada, en otros a través de SDL, incluidos el «.» es necesaria de las naciones unidas, siempre anexar a CFLAGS así adicionales pueden ser especificados en la línea de comandos, usando «LFLAGS» como segundo conjunto de cflags (w/ no advertencias).
    su comprensión de las «mejores prácticas» para el contenido de un archivo makefile y a mi entender, son significativamente diferentes. Por favor enviar un enlace a una página web que las listas de ‘mejores prácticas’ para los makefiles

    OriginalEl autor user3629249

  2. 6

    Su vinculación comando expande a:

    gcc -c -std=c99 -lm -Wall -Wextra -pedantic -O3 -Wfloat-equal -g global.o display.o player.o entities.o controls.o sound.o menu.o -o game

    que, como se puede ver, tiene la -c bandera en ella. El -c bandera indica a gcc no para realizar la vinculación. Así que no tiene nada que hacer. (.o archivos sólo puede ser utilizado para la vinculación, y se ha deshabilitado la vinculación, que es por qué usted consigue que el mensaje)

    Usted no desea utilizar los mismos indicadores para compilar y vincular. Para compilar, usted probablemente querrá -c -std=c99 -Wall -Wextra -pedantic -O3 -Wfloat-equal -g, y por la vinculación que desea -lm -lSDL2 -lSDL2_ttf -lSDL2_image -lSDL2_mixer -g.

    OriginalEl autor immibis

  3. 0

    No poner -lm o en el departamento de bibliotecas en CFLAGS, biblioteca de operandos ir hasta el final de la línea de comandos. En su lugar, utilice una variable adicional LDLIBS y modificar su game regla como esta:

    game: global.o display.o player.o entities.o controls.o sound.o menu.o
        $(GCC) $(CFLAGS) -o [email protected] global.o display.o player.o entities.o controls.o sound.o menu.o $(LDLIBS)

    La -lm operando (no es una opción) y los operandos de SDL sólo se aplicará cuando la vinculación, por lo que no debe ser parte de CFLAGS y no debe ser especificado al compilar sin vinculación (es decir, cuando -c se suministra).

    Y mejor aún, para crear una macro OBJECTS = global.o display.o player.o entities.o controls.o sound.o menu.o y, a continuación, utilizar el tanto de la dependencia y de la línea de enlace de la línea de comandos.

    OriginalEl autor fuz

Dejar respuesta

Please enter your comment!
Please enter your name here