Jump to content

Recommended Posts

Posted

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

Posted

@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).

Posted
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

  • 2 weeks later...
Posted

@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)

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.