Ir para o conteúdo
PsySc0rpi0n

Makefile para compilar um programa em OpenGL

Mensagens Recomendadas

PsySc0rpi0n

Boas.

 

Estou novamente com dificuldades em criar um Makefile.

Tenho a seguinte estrutura de pastas:

include/KHR/khrplatform.h
include/glad/glad.h
bin/
obj/
src/test.c
src/glad.c
Makefile

Preciso de criar um Makefile para fazer os linkings e etc.

Comecei através de um pequeno exemplo que encontrei na net:

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
	$(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
	rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

 

E alterei para:

CC = gcc
LIBS = -lm -Werror -g -pedantic -Wall -std=c99
CFLAGS = -I$(INCDIR) -lGL -lX11 -lGLU -lglut
INCDIR = include
OBJDIR = obj
BINDIR = bin
SRCDIR = src

TARGET = $(BINDIR)/test

_DEPS = khrplatform.h glad.h
DEPS = $(patsubst %, $(INCDIR)/KHR/%, $(INCDIR)/glad/%, $(_DEPS))
_OBJ = test.o glad.o
OBJ = $(patsubst %, %(OBJDIR)/%, $(_OBJ))

$(OBJDIR)/%.o: $(SRCDIR)/%.c $(DEPS)
	$(CC) -c -o $@ $< $(CFLAGS)

TARGET: $(OBJDIR)/%.o
	$(CC) -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
	rm -f $(OBJDIR)/*.o *~ core $(INCDIR)/*~

 

Ainda só tenho um include no file test.c mas pelo menos a compilação devia correr e talvez dar erros no file test.c mas estou apenas a obter o seguinte:

make: *** No rule to make target 'obj/%.o', needed by 'TARGET'.  Stop.

 


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

@PsySc0rpi0n

Tens ali um pequeno erro onde declaras a variável OBJ: dentro da aplicação da função patsubst, utilizas %(OBJDIR)/% onde deverias utilizar $(OBJDIR)/%. Não sei se era isso que estava a provocar-te o problema, mas experimenta corrigir (só vi isto por alto).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n
5 minutes ago, pwseo said:

@PsySc0rpi0n

Tens ali um pequeno erro onde declaras a variável OBJ: dentro da aplicação da função patsubst, utilizas %(OBJDIR)/% onde deverias utilizar $(OBJDIR)/%. Não sei se era isso que estava a provocar-te o problema, mas experimenta corrigir (só vi isto por alto).

Já corrigi mas continua com o mesmo output! :s


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

@PsySc0rpi0n

Desculpa a demora. Entretanto tenho estado menos disponível. Já vi o teu Makefile com mais detalhe e reparei que além do erro que corrigiste tens outros. Um diff da tua versão e da minha (corrigida) consiste no seguinte:

$ diff Makefile.old Makefile.new
14c14
< OBJ = $(patsubst %, %(OBJDIR)/%, $(_OBJ))
---
> OBJ = $(patsubst %, $(OBJDIR)/%, $(_OBJ))
19c19
< TARGET: $(OBJDIR)/%.o
---
> $(TARGET): $(OBJ)

Ou seja, além do erro que tinhas na invocação de patsubst, esqueceste-te de colocar TARGET dentro de $(...) e devias ter colocado como seu pré-requisito a variável $(OBJ) (que na prática já contém uma lista dos ficheiros .o que vais linkar) e não um padrão $(OBJDIR)/%.o, (utilizar este tipo de padrões implica teres um % tanto do lado do alvo como do pré-requisito).

EDIT: mais uma coisa: estás a misturar as tuas variáveis CFLAGS e LIBS (p ex tens -lm na CFLAGS, quando esse argumento claramente deveria estar na LIBS)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.