Problemas de referencia indefinida usando semáforos

4 minutos de lectura

Avatar de usuario de TheFatness
lagordura

Estoy jugando con el uso de semáforos, pero sigo encontrando advertencias de referencia indefinida, lo que hace que mi código no funcione. Saqué un código de ejemplo de un texto, pero tenía problemas con parte de su sintaxis, así que fui al tutorial de semáforos de POSIX y cambié las cosas a su sintaxis y, como resultado, ahora recibo estos errores de referencia.

Puede que simplemente esté pasando por alto algo, pero no puedo encontrarlo.

Errores:

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

Lo que tengo (puede parecer un poco feo debido a la forma en que comenté las cosas con mi método anterior) También sé que mi método de agregar no funcionará, pero lo abordaré cuando solucione mis problemas de sintaxis:

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

}

  • ¿Puedes publicar errores exactos?

    – GoldRoger

    9 de mayo de 2014 a las 3:17

  • Publicación original actualizada con errores copiados de la terminal.

    – La gordura

    9 de mayo de 2014 a las 3:23

Avatar de usuario de Ryan Haining
ryan haining

Si está en un sistema Linux, deberá compilar y vincular con el -pthread marca para vincular la biblioteca pthreads.

gcc -pthread Producers_Consumers.c

Como ha señalado Paul Griffiths, también puede utilizar -lrtque es más portátil y vincula la biblioteca POSIX Realtime Extensions

gcc Producers_Consumers.c -lrt

Otras notas específicas del código en la pregunta:

  • int main(void) no void main()
  • typedef int semaphore Está Mal, sem_t debe tratarse como un tipo opaco, nunca use este typedef en su código de todos modos.
  • Un problema que preveo es que su consumer código utiliza los semáforos antes de que se inicialicen en producer. Debe inicializarlos en su main

  • Tu puedes necesitar -lrty las bibliotecas deberían ir tras el .c expediente.

    – Hombre cuervo

    9 de mayo de 2014 a las 3:27

  • Guau. Simplemente guau. Sabía que estaba pasando por alto algo simple. Esto resolvió mi problema original. ¡Gracias! En cuanto al principal… ¡Lo sé, estaba experimentando y olvidé volver a cambiarlo!

    – La gordura

    9 de mayo de 2014 a las 3:28

  • @PaulGriffiths gracias, actualizado. Para referencia del lector, -pthread no es lo mismo que el comando vinculado -lpthready hace un poco más, por lo que no tiene que seguir el c archivos

    -Ryan Haining

    9 de mayo de 2014 a las 3:30

  • He intentado -lrt, -lpthready -pthread porque cada fuente que leo cita algo diferente, y ninguno de ellos funciona. el comando es gcc -c ./src/server.c -lrt/pthread/lpthread

    – krb686

    27 de abril de 2015 a las 12:37


  • @RyanHaining Lo siento, se solucionó. No estaba siguiendo el orden gcc de argumentos y archivos.

    – krb686

    27/04/2015 a las 19:23

Tengo el mismo error en ubuntu qt. Después de agregar

LIBRES += -lpthread -lrt

al archivo project.pro todo bien compilado.

¿Ha sido útil esta solución?