Newsgroup: it.comp.lang.c
Titolo: problema di linking

Ciao a tutti,
ho il seguente file make:
SDL_CFLAGS := $(shell sdl-config --cflags)
SDL_LDFLAGS := $(shell sdl-config --libs)
SMPEG_LDFLAGS := -lsmpeg
OPENAL_LDFLAGS = -lopenal
interface : ediMameInt.o audio.o
	gcc -o interface ediMameInt.o audio.o $(SMPEG_LDFLAGS)
$(OPENAL_LDFLAGS)
ediMameInt.o : ediMameInt.c ediMameInt.h
	gcc -c ediMameInt.c $(SDL_CFLAGS)
audio.o : audio.c audio.h
	gcc -o audio.o -c audio.c 
che da il seguente errore:
bash-2.05b$ make
gcc -c ediMameInt.c -I/usr/local/include/SDL -D_REENTRANT
gcc -o audio.o -c audio.c
gcc -o interface ediMameInt.o audio.o -lsmpeg -lopenal
audio.o(.bss+0x0): multiple definition of `SourcePos'
ediMameInt.o(.bss+0x0): first defined here
audio.o(.bss+0xc): multiple definition of `SourceVel'
ediMameInt.o(.bss+0xc): first defined here
audio.o(.bss+0x18): multiple definition of `ListenerPos'
ediMameInt.o(.bss+0x18): first defined here
audio.o(.bss+0x24): multiple definition of `ListenerVel'
ediMameInt.o(.bss+0x24): first defined here
audio.o(.data+0x0): multiple definition of `ListenerOri'
ediMameInt.o(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [interface] Error 1
In pratica mi crea i due file oggetto e poi non riesce a linkare, se
non sbaglio... ma non capisco cosa significhi "multiple definition",
io quelle variabili le definisco una sola volta nel file audio.h ...
inoltre il file audio.h è racchiuso tra 
#ifndef AUDIO
#define AUDIO
[dichiarazioni incriminate]
#endif
boh? se metto tutto in un'unico file funziona (ovviamente), ma il
codice fa pena... help me, please!!
grazie mille
g4b0

 codice fa pena... help me, please!!
pippo.h:
   #ifndef _PIPPO_H_
   #define _PIPPO_H_
   extern char * Pippo; /* <--- DICHIARAZIONE */
   extern void salutaPippo (void);
   #endif
pippo1.c:
   #include "pippo.h"
   void salutaPippo (void)
   {
      printf("Ciao, %s!\n", Pippo);
   }
pippo2.c:
   #include "pippo.h"
   char * Pippo = "Goofy"; /* <--- DEFINIZIONE E INIZIALIZZAZIONE */
   int main (void)
   {
       salutaPippo();
       return 0;
   }
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 [dichiarazioni incriminate]
Mi spieghi come puoi pensare che la gente possa aiutarti se tu stesso
censuri il tuo codice ? ti costa tanto riportare *esattamente* la parte di
codice che produce errore ? 


 codice che produce errore ?
chiedo scusa, mea culpa ... :)
ecco il codice:
#include <stdlib.h>
#include <stdio.h>
#include <AL/al.h>
#include <AL/alc.h>
#include <AL/alut.h>
#ifndef AUDIO
#define AUDIO
// Buffers hold sound data.
ALuint Buffer;
// Sources are points emitting sound.
ALuint Source;
// Position of the source sound.
ALfloat SourcePos[] = { 0.0, 0.0, 0.0 };
// Velocity of the source sound.
ALfloat SourceVel[] = { 0.0, 0.0, 0.0 };
// Position of the listener.
ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 };
// Velocity of the listener.
ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 };
// Orientation of the listener. (first 3 elements are "at", second 3 are "up")
ALfloat ListenerOri[] = { 0.0, 0.0, -1.0,  0.0, 1.0, 0.0 };
ALboolean LoadALData();
void SetListenerValues();
void KillALData();
#endif

 ALfloat SourcePos[] = { 0.0, 0.0, 0.0 };
Questa definizione (e le altre analoghe) non possono stare in un file header
che viene incluso in diverse unitą di compilazione. 
Cingar l'ha spiegato l'altro giorno nella sua risposta in questo thread. Per
risolvere il problema di linking, segui le sue indicazioni.
Max