c - 使用信号量的 undefined reference 问题

标签 c semaphore undefined-reference

我正在尝试使用信号量,但我一直遇到 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() {

}

最佳答案

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

gcc -pthread Producers_Consumers.c

正如 Paul Griffiths 所指出的,您还可以使用更便携的 -lrt,并链接 POSIX Realtime Extensions 库

gcc Producers_Consumers.c -lrt

问题中代码的其他说明:

  • int main(void) 不是 void main()
  • typedef int semaphore 是错误的,sem_t 应该被视为不透明类型,您永远不要在代码中使用此 typedef。
  • 我预见到的一个问题是您的consumer 代码在信号量在producer 中初始化之前使用了信号量。您应该在 main
  • 中初始化它们

关于c - 使用信号量的 undefined reference 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23556042/

相关文章:

c - 如何在 C 中使用 qsort() 对二维数组进行排序

java - 新线程和调用线程都会被阻塞 Java Semaphore

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c - 如何在 Cmake 中链接 curses.h?

c++ - 来自调用程序的对库类成员的 undefined reference 错误

对 htonl 输出感到困惑

跨平台系统使用指标

c - #include <stdio.h> 中的主题标签无法编译(C 编程)

与条件变量相比,队列应用程序中的 C++20 信号量似乎很慢

java - 信号量 : Critical Section with priorities