Undefinierte Referenzausgaben mit Semaphoren

Lesezeit: 4 Minuten

Benutzeravatar von TheFatness
Die Fettheit

Ich spiele mit der Verwendung von Semaphoren herum, aber ich stoße immer wieder auf Undefined Reference-Warnungen, wodurch mein Code nicht funktioniert. Ich habe Beispielcode aus einem Text gezogen, hatte aber Probleme mit einigen ihrer Syntax, also ging ich zum Semaphor-Tutorial von POSIX und änderte die Dinge in ihre Syntax und als Ergebnis erhalte ich jetzt diese Referenzfehler.

Vielleicht übersehe ich einfach etwas, 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 kann ein bisschen hässlich aussehen, weil ich Dinge aus meiner alten Methode auskommentiert habe) Ich weiß auch, dass meine Additionsmethode nicht funktioniert, aber ich werde dazu kommen, wenn ich meine Syntaxprobleme behebe:

#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() {

}

  • Kannst du genaue Fehler posten?

    – GoldRoger

    9. Mai 2014 um 3:17 Uhr

  • Aktualisierter Originalbeitrag mit Fehlern, die vom Terminal kopiert wurden.

    – Die Fettheit

    9. Mai 2014 um 3:23 Uhr

Benutzeravatar von Ryan Haining
Ryan Haining

Wenn Sie sich auf einem Linux-System befinden, müssen Sie die kompilieren und mit ihr verknüpfen -pthread -Flag, um die pthreads-Bibliothek zu verknüpfen.

gcc -pthread Producers_Consumers.c

Wie Paul Griffiths betont hat, können Sie auch verwenden -lrtdas portabler ist und die POSIX Realtime Extensions-Bibliothek verknüpft

gcc Producers_Consumers.c -lrt

Weitere Hinweise zum Code in der Frage:

  • int main(void) nicht void main()
  • typedef int semaphore ist falsch, sem_t als undurchsichtiger Typ behandelt werden soll, verwenden Sie diese Typedef sowieso nie in Ihrem Code.
  • Ein Problem, das ich voraussehe, ist, dass Ihr consumer Code verwendet die Semaphoren, bevor sie initialisiert werden producer. Sie sollten sie in Ihrem initialisieren main

  • Sie brauchen möglicherweise -lrtund die Bibliotheken sollten nach dem gehen .c Datei.

    – Krähenmann

    9. Mai 2014 um 3:27 Uhr

  • Wow. Einfach wow. Ich wusste, dass ich etwas Einfaches übersah. Dies löste mein ursprüngliches Problem. Danke! Was das Wichtigste betrifft … Ich weiß, ich habe experimentiert und vergessen, es wieder zu ändern!

    – Die Fettheit

    9. Mai 2014 um 3:28 Uhr

  • @PaulGriffiths danke, aktualisiert. Als Referenz für den Leser, -pthread ist nicht dasselbe wie der verknüpfte Befehl -lpthreadund tut ein bisschen mehr, weshalb es dem nicht folgen muss c Dateien

    – Ryan Haining

    9. Mai 2014 um 3:30 Uhr

  • ich habe es versucht -lrt, -lpthreadund -pthread weil jede Quelle, die ich lese, etwas anderes zitiert, und keine davon funktioniert. Der Befehl ist gcc -c ./src/server.c -lrt/pthread/lpthread

    – krb686

    27. April 2015 um 12:37 Uhr


  • @RyanHaining Tut mir leid, dass es behoben wurde. Ich habe die gcc-Reihenfolge von Argumenten und Dateien nicht befolgt

    – krb686

    27. April 2015 um 19:23 Uhr

Habe den gleichen Fehler in Ubuntu Qt. Nach dem Hinzufügen

LIBS += -lpthread -lrt

zur project.pro-Datei alles gut kompiliert.

1437390cookie-checkUndefinierte Referenzausgaben mit Semaphoren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy