Неопределенные справочные проблемы с использованием семафоров

Я играю с использованием семафоров, но продолжаю сталкиваться с предупреждениями Undefined Reference, в результате чего мой код не работает. Я вытащил пример кода из текста, но у меня были проблемы с некоторым их синтаксисом, поэтому я пошел к учебнику по семафорам POSIX и изменил его синтаксис, и в результате теперь получаю эти ссылочные ошибки.

Возможно, я просто что-то упускаю, но не могу найти.

Ошибки:

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

Что у меня есть (может показаться немного уродливым из-за того, как я комментировал вещи из моего старого метода) Я также знаю, что мой метод добавления не будет работать, но я доберусь до этого, когда исправлю свои проблемы с синтаксисом:

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

}
 TheFatness09 мая 2014 г., 05:23
Обновлен оригинальный пост с ошибками, скопированными из терминала.
 GoldRoger09 мая 2014 г., 05:17
Можете ли вы опубликовать точные ошибки?

Ответы на вопрос(2)

Получил ту же ошибку в Ubuntu QT. После добавления

LIBS + = -lpthread -lrt

в файл project.pro все отлично скомпилировано.

Если вы работаете в системе Linux, вам нужно скомпилировать и связать с-pthread флаг, чтобы связать библиотеку pthreads.

gcc -pthread Producers_Consumers.c

Как отметил Пол Гриффитс, вы также можете использовать-lrt, который является более переносимым, и связывает библиотеку POSIX Realtime Extensions

gcc Producers_Consumers.c -lrt
int main(void) неvoid main()typedef int semaphore неправильно,sem_t следует рассматривать как непрозрачный тип, вы никогда не используете этот typedef в своем коде в любом случае.Проблема, которую я предвижу, заключается в том, что вашаconsumer код использует семафоры до их инициализации вproducer, Вы должны инициализировать их в вашемmain
 Paul Griffiths09 мая 2014 г., 05:27
Вам может понадобиться-lrtи библиотеки должны идти после.c файл.
 krb68627 апр. 2015 г., 21:23
@RyanHaining Извините, это исправлено. Я не следил за порядком следования файлов и файлов gcc
 TheFatness09 мая 2014 г., 05:28
Вот это да. Просто вау. Я знал, что я пропускаю что-то простое. Это решило мою первоначальную проблему. Спасибо! Что касается основного ... Я знаю, я экспериментировал и забыл изменить его обратно!
 Ryan Haining09 мая 2014 г., 05:30
@PaulGriffiths спасибо, обновлено. Для справки читателя,-pthread не то же самое, что связанная команда-lpthreadи делает немного больше, поэтому он не должен следоватьc файлы
 krb68627 апр. 2015 г., 14:37
я пробовал-lrt, -lpthread, а также-pthread потому что каждый источник, который я читаю, цитирует что-то свое, и ни один из них не работает. Командаgcc -c ./src/server.c -lrt/pthread/lpthread
 glampert09 мая 2014 г., 05:26
Я всегда думал, что API семафоров не имеет отношения к pthreads ...

Ваш ответ на вопрос