Вопрос по c, undefined-reference, semaphore – Неопределенные справочные проблемы с использованием семафоров

10

Я играю с использованием семафоров, но продолжаю сталкиваться с предупреждениями 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() {

}
Обновлен оригинальный пост с ошибками, скопированными из терминала. TheFatness
Можете ли вы опубликовать точные ошибки? GoldRoger

Ваш Ответ

2   ответа
18

Если вы работаете в системе 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
@RyanHaining Извините, это исправлено. Я не следил за порядком следования файлов и файлов gcc krb686
Вот это да. Просто вау. Я знал, что я пропускаю что-то простое. Это решило мою первоначальную проблему. Спасибо! Что касается основного ... Я знаю, я экспериментировал и забыл изменить его обратно! TheFatness
я пробовал-lrt, -lpthread, а также-pthread потому что каждый источник, который я читаю, цитирует что-то свое, и ни один из них не работает. Командаgcc -c ./src/server.c -lrt/pthread/lpthread krb686
Вам может понадобиться-lrtи библиотеки должны идти после.c файл. Paul Griffiths
2

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

LIBS + = -lpthread -lrt

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

Похожие вопросы