web-dev-qa-db-ja.com

セマフォを使用した未定義の参照の問題

セマフォを使用して遊んでいますが、未定義の参照の警告が頻繁に発生するため、コードが機能しません。テキストからサンプルコードをプルしましたが、一部の構文に問題があったため、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() {

}
11
TheFatness

Linuxシステムを使用している場合は、コンパイルして_-pthread_フラグを使用してリンクし、pthreadsライブラリをリンクする必要があります。

_gcc -pthread Producers_Consumers.c
_

Paul Griffithsが指摘したように、より移植性が高く、POSIX Realtime Extensionsライブラリをリンクする_-lrt_を使用することもできます。

_gcc Producers_Consumers.c -lrt
_

  • int main(void)ではないvoid main()
  • _typedef int semaphore_は間違っています。_sem_t_は不透明な型として扱う必要があります。このtypedefをコードで使用することは決してありません。
  • 私が予測する問題は、consumerコードがproducerで初期化される前にセマフォを使用することです。 mainで初期化する必要があります
18
Ryan Haining

Ubuntu qtで同じエラーが発生しました。追加後

LIBS + = -lpthread -lrt

project.proファイルにすべてコンパイルされてうまくいきます。

2
Alexey