sirus
12-09-2009, 23:59
Ciao a tutti, ho un bel problema di linking con il progetto che sto sviluppando in questo periodo, o meglio, il problema di linking lo ho solo su Mac OS X e non su Linux.
CC = gcc
ifeq ($(DIST),debug)
BUILDDIR = ../build/debug
CFLAGS = -g -std=c99 -pedantic -Wall -O3
else
BUILDDIR = ../build/release
CFLAGS = -std=c99 -pedantic -Wall -O3
endif
ifeq ($(TARGET),mac)
LDFLAGS = -lGL -lGLU -lfreeglut -Xlinker -multiply_defined -Xlinker suppress
IDIR = -I/usr/X11/include -I/opt/freeglut/include/GL
LDIR = -L/opt/freeglut/lib -L/System/Library/Frameworks/OpenGL.framework/Libraries/
else
LDFLAGS = -lglut -lm -lGLU -lGL -Xlinker -zmuldefs
IDIR = -I/mnt_nfs/home4/instruct/i488/freeglut/include/GL/
LDIR = -L/mnt_nfs/home4/instruct/i488/freeglut/src/.libs -L/usr/lib
endif
OBJDIR = $(BUILDDIR)/obj
OBJFILES = $(OBJDIR)/main.o $(OBJDIR)/handlers.o $(OBJDIR)/draw.o $(OBJDIR)/types.o $(OBJDIR)/list.o
EXECUTABLE = $(BUILDDIR)/kaleidoscope
RM = rm
MKDIR = mkdir
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJFILES)
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(LDFLAGS) $(IDIR) $(LDIR) $(OBJFILES) -o $(EXECUTABLE)
$(OBJDIR)/main.o: main.c handlers.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c main.c $(IDIR) $(LDIR) -o $(OBJDIR)/main.o
$(OBJDIR)/handlers.o: handlers.c handlers.h draw.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c handlers.c $(IDIR) $(LDIR) -o $(OBJDIR)/handlers.o
$(OBJDIR)/draw.o: draw.c draw.h types.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c draw.c $(IDIR) $(LDIR) -o $(OBJDIR)/draw.o
$(OBJDIR)/types.o: types.c types.h list.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c types.c -o $(OBJDIR)/types.o
$(OBJDIR)/list.o: list.c list.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c list.c -o $(OBJDIR)/list.o
clean:
$(RM) -f $(BUILDDIR)/$(EXECUTABLE)
$(RM) -rf $(OBJDIR)
$(RM) -rf $(BUILDDIR)
Qui potete vedere il makefile che ho scritto, nulla di particolarmente complicato a dire il vero, tuttavia avendo inserito globals.h come dipendenza per tutti i sorgenti (contiene delle macro, costanti e variabili - dichiarate come extern - che interessano tutti i file) ho subito riscontrato un problema di simboli duplicati durante il linking.
Per risolvere il problema su Linux ho semplicemente aggiunto la flag -Xlinker -zmuldefs nelle opzioni di linking; per Mac OS X ho seguito la stessa via aggiungengo la flag -Xlinker -multiply_defined -Xlinker suppress ma sembra che il linker la ignori.
Google non mi è stato d'aiuto purtroppo, qualcuno ha già avuto questo problema?
NB: non si tratta di un problema grosso perché la macchina target è Linux, tuttavia, non avendo sotto mano una macchina Linux su cui possa utilizzare OpenGL connettermi in ssh alla macchina dell'università tutte le volte che devo fare una prova è piuttosto seccante. :D
Visto che ho perso non poco tempo anche per capire come compilare FreeGLUT su Mac OS X ora mi piacerebbe proprio poter utilizzare la mia macchina per le prove. ;)
CC = gcc
ifeq ($(DIST),debug)
BUILDDIR = ../build/debug
CFLAGS = -g -std=c99 -pedantic -Wall -O3
else
BUILDDIR = ../build/release
CFLAGS = -std=c99 -pedantic -Wall -O3
endif
ifeq ($(TARGET),mac)
LDFLAGS = -lGL -lGLU -lfreeglut -Xlinker -multiply_defined -Xlinker suppress
IDIR = -I/usr/X11/include -I/opt/freeglut/include/GL
LDIR = -L/opt/freeglut/lib -L/System/Library/Frameworks/OpenGL.framework/Libraries/
else
LDFLAGS = -lglut -lm -lGLU -lGL -Xlinker -zmuldefs
IDIR = -I/mnt_nfs/home4/instruct/i488/freeglut/include/GL/
LDIR = -L/mnt_nfs/home4/instruct/i488/freeglut/src/.libs -L/usr/lib
endif
OBJDIR = $(BUILDDIR)/obj
OBJFILES = $(OBJDIR)/main.o $(OBJDIR)/handlers.o $(OBJDIR)/draw.o $(OBJDIR)/types.o $(OBJDIR)/list.o
EXECUTABLE = $(BUILDDIR)/kaleidoscope
RM = rm
MKDIR = mkdir
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJFILES)
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(LDFLAGS) $(IDIR) $(LDIR) $(OBJFILES) -o $(EXECUTABLE)
$(OBJDIR)/main.o: main.c handlers.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c main.c $(IDIR) $(LDIR) -o $(OBJDIR)/main.o
$(OBJDIR)/handlers.o: handlers.c handlers.h draw.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c handlers.c $(IDIR) $(LDIR) -o $(OBJDIR)/handlers.o
$(OBJDIR)/draw.o: draw.c draw.h types.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c draw.c $(IDIR) $(LDIR) -o $(OBJDIR)/draw.o
$(OBJDIR)/types.o: types.c types.h list.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c types.c -o $(OBJDIR)/types.o
$(OBJDIR)/list.o: list.c list.h globals.h
$(MKDIR) -p $(BUILDDIR)
$(MKDIR) -p $(OBJDIR)
$(CC) $(CFLAGS) -c list.c -o $(OBJDIR)/list.o
clean:
$(RM) -f $(BUILDDIR)/$(EXECUTABLE)
$(RM) -rf $(OBJDIR)
$(RM) -rf $(BUILDDIR)
Qui potete vedere il makefile che ho scritto, nulla di particolarmente complicato a dire il vero, tuttavia avendo inserito globals.h come dipendenza per tutti i sorgenti (contiene delle macro, costanti e variabili - dichiarate come extern - che interessano tutti i file) ho subito riscontrato un problema di simboli duplicati durante il linking.
Per risolvere il problema su Linux ho semplicemente aggiunto la flag -Xlinker -zmuldefs nelle opzioni di linking; per Mac OS X ho seguito la stessa via aggiungengo la flag -Xlinker -multiply_defined -Xlinker suppress ma sembra che il linker la ignori.
Google non mi è stato d'aiuto purtroppo, qualcuno ha già avuto questo problema?
NB: non si tratta di un problema grosso perché la macchina target è Linux, tuttavia, non avendo sotto mano una macchina Linux su cui possa utilizzare OpenGL connettermi in ssh alla macchina dell'università tutte le volte che devo fare una prova è piuttosto seccante. :D
Visto che ho perso non poco tempo anche per capire come compilare FreeGLUT su Mac OS X ora mi piacerebbe proprio poter utilizzare la mia macchina per le prove. ;)