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() {
}
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 -lrt
que 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)
novoid 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 enproducer
. Debe inicializarlos en sumain
-
Tu puedes necesitar
-lrt
y 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-lpthread
y hace un poco más, por lo que no tiene que seguir elc
archivos-Ryan Haining
9 de mayo de 2014 a las 3:30
-
He intentado
-lrt
,-lpthread
y-pthread
porque cada fuente que leo cita algo diferente, y ninguno de ellos funciona. el comando esgcc -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.
¿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