使用信号量的未定义参考问题

我正在使用信号量,但我一直遇到未定义的参考警告,从而导致我的代码无法工作。 我从文本中提取了示例代码,但是他们的一些语法出现了问题,所以我去了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  #include  #include  #include  #include  #include  #include  #include  #include  #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() { } 

如果您使用的是Linux系统,则需要编译并链接-pthread标志以链接pthreads库。

 gcc -pthread Producers_Consumers.c 

正如Paul Griffiths指出的那样,你也可以使用更便携的-lrt ,并链接POSIX Realtime Extensions库

 gcc Producers_Consumers.c -lrt 

  • int main(void) not void main()
  • typedef int semaphore是错误的, sem_t应该被视为opaque类型,你从不在代码中使用这个typedef。
  • 我预见的一个问题是您的consumer代码在producer中初始化之前使用信号量。 你应该在你的main初始化它们

在ubuntu qt中遇到同样的错误。 添加后

LIBS + = -lpthread -lrt

到project.pro文件都编译好了。