2014-05-09 29 views
8

Sto giocando con l'utilizzo di Semaphores, ma continuo a riscontrare avvisi di riferimento non definito, causando così il mio codice non funziona. Ho estratto il codice di esempio da un testo, ma ho riscontrato problemi con alcune delle loro sintassi, quindi sono passato al tutorial sul semaforo di POSIX e ho modificato le cose nella loro sintassi e, di conseguenza, sto ottenendo questi errori di riferimento.Problemi di riferimento non definiti utilizzando i semafori

Posso semplicemente trascurare qualcosa, ma non riesco a trovarlo.

Errori:

Producers_Consumers.c:52: warning: return type of ‘main’ is not ‘int’ 
/tmp/cceeOM6F.o: In function `producer': 
Producers_Consumers.c:(.text+0x1e): undefined reference to `sem_init' 
Producers_Consumers.c:(.text+0x3a): undefined reference to `sem_init' 
Producers_Consumers.c:(.text+0x46): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x52): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x5e): undefined reference to `sem_post' 
Producers_Consumers.c:(.text+0x6a): undefined reference to `sem_post' 
/tmp/cceeOM6F.o: In function `consumer': 
Producers_Consumers.c:(.text+0x7e): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x8a): undefined reference to `sem_wait' 
Producers_Consumers.c:(.text+0x96): undefined reference to `sem_post' 
Producers_Consumers.c:(.text+0xa2): undefined reference to `sem_post' 
collect2: ld returned 1 exit status 

Quello che ho (può sembrare un po 'brutto a causa del modo in cui ho commentato le cose dal mio vecchio metodo) So anche il mio metodo aggiungendo non funziona, ma io' ll arrivare a che, quando posso risolvere i miei problemi di sintassi:

#include <stdio.h> 
#include <semaphore.h> 
#include <string.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <errno.h> 

#define N 10  //Number of slots in buffer 
typedef int semaphore; //Semaphores ae a special kind of int 
sem_t mutex; //Controls access to critical region 1 
sem_t empty; //Counts empty buffer slots N 
sem_t full; //Counts full buffer slots 0 
int count = 0; //What we're putting in 
//int buffer[N]; 

void producer(void) { 
    sem_init(&mutex, 0, 1); 
    //sem_init(&empty, 0, N); 
    sem_init(&full, 0, 0); 

    while(1) { 
     sem_wait(&empty); 
     sem_wait(&mutex); 
     //printf("Empy: %d\n",empty); 
     //printf("Mutex: %d\n",mutex); 
     //printf("Both Downs Ran\n"); 
     //buffer = buffer + 1; 
     sem_post(&mutex); 
     sem_post(&full); 
     //printf("Producer produced: %d\n",buffer); 
    } 
} 

void consumer(void) { 
    while(1) { 
     sem_wait(&full); 
     sem_wait(&mutex); 
     //item = buffer; 
     sem_post(&mutex); 
     sem_post(&empty); 
     //printf("Consumer consumed: %d/n",item); 
    } 
} 

void main() { 

} 
+0

Puoi pubblicare errori esatti? – GoldRoger

+0

Post originale aggiornato con errori copiati dal terminale. – TheFatness

risposta

17

Se siete su un sistema Linux, è necessario compilare e legame con la bandiera -pthread di collegare la libreria pthread.

gcc -pthread Producers_Consumers.c 

Come Paul Griffiths ha sottolineato, è anche possibile utilizzare -lrt, che è più portabile, e collega la libreria POSIX Realtime estensioni

gcc Producers_Consumers.c -lrt 

  • non int main(void)void main()
  • typedef int semaphore è errato, sem_t deve essere trattato come un tipo opaco , non usi mai questo typedef nel tuo codice comunque.
  • Un problema che prevedo è che il codice consumer utilizza i semafori prima dell'inizializzazione in producer. Dovresti inizializzarli nel tuo main
+0

Ho sempre pensato che l'API dei semafori non fosse correlata a pthreads ... – glampert

+0

Potrebbe essere necessario '-lrt', e le librerie dovrebbero andare dopo il file' .c'. –

+0

Wow. Solo wow. Sapevo che stavo trascurando qualcosa di semplice. Questo ha risolto il mio problema originale. Grazie! Per quanto riguarda il main ... lo so, stavo sperimentando e ho dimenticato di cambiarlo! – TheFatness

2

Ottenuto lo stesso errore in Ubuntu qt. Dopo aver aggiunto

LIBS + = -lpthread -lrt

a project.pro file di tutti compilato bene.