2016-10-18 55 views
1

私はかなり新しいC言語です。g++ ./main.cを使用してプログラムをコンパイルしようとすると、なぜこれらのエラーが発生するのか分かりません。私は他のリソースを見てみると、私は必要な答えを見つけることができません。既に知っている解決策がある場合は、ここにも投稿してください。未定義g ++でコンパイルするときのsem_waitとpthread_createへの参照

/tmp/ccSGRAcp.o: In function `producer(void*)': 
main.c:(.text+0x12): undefined reference to `sem_wait' 
main.c:(.text+0x1c): undefined reference to `sem_wait' 
main.c:(.text+0xa0): undefined reference to `sem_post' 
main.c:(.text+0xaa): undefined reference to `sem_post' 
/tmp/ccSGRAcp.o: In function `consumer(void*)': 
main.c:(.text+0xc5): undefined reference to `sem_wait' 
main.c:(.text+0xcf): undefined reference to `sem_wait' 
main.c:(.text+0x153): undefined reference to `sem_post' 
main.c:(.text+0x15d): undefined reference to `sem_post' 
/tmp/ccSGRAcp.o: In function `main': 
main.c:(.text+0x17e): undefined reference to `sem_init' 
main.c:(.text+0x192): undefined reference to `sem_init' 
main.c:(.text+0x1a6): undefined reference to `sem_init' 
main.c:(.text+0x1c1): undefined reference to `pthread_create' 
main.c:(.text+0x1dc): undefined reference to `pthread_create' 
main.c:(.text+0x1f7): undefined reference to `pthread_create' 
main.c:(.text+0x212): undefined reference to `pthread_create' 
main.c:(.text+0x22d): undefined reference to `pthread_create' 
/tmp/ccSGRAcp.o:main.c:(.text+0x248): more undefined references to `pthread_create' follow 
collect2: error: ld returned 1 exit status 

私がコンパイルしようとしているコードは

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <semaphore.h> 
#include <pthread.h> 

#define N 10000000 

typedef struct 
{ 
    char const* buf[N]; 
    char in; 
    char out; 

    sem_t mutex; 
    sem_t full; 
    sem_t empty; 

} bufferItems; 

bufferItems sharedBuffer; 


void *producer(void *arg) { 

    while(1) { 
     sem_wait(&sharedBuffer.empty); 
     sem_wait(&sharedBuffer.mutex); 
     sharedBuffer.buf[sharedBuffer.in] = "X"; 
     sharedBuffer.in = (sharedBuffer.in+1)%N; 
     printf("Producer "); 
     printf("%c", sharedBuffer.in); 
     printf("\n"); 
     sem_post(&sharedBuffer.mutex); 
     sem_post(&sharedBuffer.full); 


    } 

} 

void *consumer(void *arg){ 

    while(1){ 
     sem_wait(&sharedBuffer.full); 
     sem_wait(&sharedBuffer.mutex); 
     sharedBuffer.buf[sharedBuffer.out] = NULL; 
     sharedBuffer.out = (sharedBuffer.out+1)%N; 
     printf("Consumer "); 
     printf("%c", sharedBuffer.out); 
     printf("\n"); 
     sem_post(&sharedBuffer.mutex); 
     sem_post(&sharedBuffer.empty); 

    } 

} 


int main(void) { 

    sem_init(&sharedBuffer.mutex, 0, 0); 
    sem_init(&sharedBuffer.full, 0, 0); 
    sem_init(&sharedBuffer.empty, 0, N); 

    pthread_t p1; 
    pthread_t p2; 
    pthread_t p3; 
    pthread_t p4; 

    pthread_t c1; 
    pthread_t c2; 
    pthread_t c3; 
    pthread_t c4; 

    // create four producer threads 
    pthread_create(&p1,NULL,producer,NULL); 
    pthread_create(&p2,NULL,producer,NULL); 
    pthread_create(&p3,NULL,producer,NULL); 
    pthread_create(&p4,NULL,producer,NULL); 
    // create four consumer threads 
    pthread_create(&c1,NULL,consumer,NULL); 
    pthread_create(&c2,NULL,consumer,NULL); 
    pthread_create(&c3,NULL,consumer,NULL); 
    pthread_create(&c4,NULL,consumer,NULL); 
} 
+1

をリンクするため、すべてのスレッドのもので引っ張って-pthreadのparamを追加しているあなたのコードのCまたはC++で? g ++はC++用です。 – Michas

答えて

5

g++ ./main.c -pthread 
+0

ありがとうございます!私は何時間もこれに固執してきた。 – CW2272

関連する問題