2014-05-09 15 views
8

Ich spiele gerade mit Semaphoren herum, aber ich stoße immer wieder auf Warnhinweise für nicht definierte Referenzen, was dazu führt, dass mein Code nicht funktioniert. Ich habe Beispielcode aus einem Text gezogen, hatte aber Probleme mit einigen ihrer Syntax, also ging ich zum POSIX-Semaphore-Tutorial und änderte die Dinge in ihre Syntax um und erhielt als Ergebnis diese Referenzfehler.Undefined Referenzprobleme bei der Verwendung von Semaphoren

Ich kann einfach etwas übersehen, aber ich kann es nicht finden.

Fehler:

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 

Was ich habe (es ist ein bisschen hässlich aufgrund der Art und Weise aussehen kann ich die Dinge auf Kommentar von meiner alten Methode) Ich weiß auch, meine Zugabe Methode wird nicht funktionieren, aber ich ll, dass, wenn ich meine Syntax Probleme zu beheben:

#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

Können Sie genaue Fehler posten? – GoldRoger

+0

Aktualisierter Originalpost mit Fehlern, die vom Terminal kopiert wurden. – TheFatness

Antwort

17

Wenn Sie auf einem linux-System sind, müssen Sie mit der -pthread Flagge kompilieren und verknüpfen die pthreads-Bibliothek zu verknüpfen.

gcc -pthread Producers_Consumers.c 

Wie Paul Griffiths hat darauf hingewiesen, Sie auch -lrt verwenden können, die mehr tragbar ist, und verbindet die POSIX-Echtzeit-Erweiterungen Bibliothek

gcc Producers_Consumers.c -lrt 

  • int main(void) nicht void main()
  • typedef int semaphore ist falsch, sem_t sollte als undurchsichtiger Typ behandelt werden , du verwendest dieses Typedef niemals in deinem Code.
  • Ein Problem, das ich vorhersehe ist, dass Ihr consumer Code die Semaphore verwendet, bevor sie in producer initialisiert werden. Sie sollten sie in Ihrem main
+0

Ich dachte immer, dass die Semaphoren-API nicht mit Pthreads verwandt war ... – glampert

+0

Sie können '-lrt' benötigen, und die Bibliotheken sollten nach der' .c' Datei gehen. –

+0

Wow. Einfach wow. Ich wusste, dass ich etwas Einfaches übersah. Das hat mein ursprüngliches Problem gelöst. Vielen Dank! Wie für die wichtigsten ... Ich weiß, ich habe experimentiert und vergessen, es wieder zu ändern! – TheFatness

2

gleichen Fehler in Ubuntu qt initialisieren. Nach der Zugabe von

LIBS + = -lpthread -lrt

project.pro Datei, die alle fein zusammengestellt.