2014-05-09 70 views
8

我在使用信號量,但是我一直在遇到未定義的引用警告,從而導致我的代碼無法工作。我從文本中提取了示例代碼,但是它們的某些語法存在問題,所以我去了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() { 

} 
+0

你能發佈確切的錯誤嗎? – GoldRoger

+0

更新了從終端複製錯誤的原始帖子。 – TheFatness

回答

17

如果你是一個Linux系統上,你需要編譯和鏈接與-pthread標誌pthreads庫鏈接。

gcc -pthread Producers_Consumers.c 

正如保羅·格里菲斯已經指出的那樣,你也可以使用-lrt,這是更便攜,和鏈接的POSIX實時擴展庫

gcc Producers_Consumers.c -lrt 

  • int main(void)void main()
  • typedef int semaphore是錯誤的,sem_t應視爲不透明類型,你永遠不會在你的代碼中使用這個typedef。
  • 我預見到的一個問題是您的consumer代碼在producer中初始化之前使用信號量。你應該初始化它們main
+0

我一直認爲信號量API與pthreads無關... – glampert

+0

您可能需要'-lrt',並且這些庫應該放在'.c'文件之後。 –

+0

哇。哇哇!我知道我忽略了一些簡單的東西。這解決了我的原始問題。謝謝! 至於主...我知道,我正在試驗,忘了把它改回來! – TheFatness

2

在ubuntu qt中得到同樣的錯誤。 加入

LIBS後+ = -lpthread -lrt

到project.pro文件中的所有編譯罰款。