对'shm_open'的未定义引用

5

我正在尝试制作一个简单的通信程序,使用共享内存。

它应该能够写入一些文本并将其保存在共享内存中。

有人能解释一下为什么我会收到以下错误:

未定义的参考`shm_open'
collect2: 错误:ld返回1个退出状态

我试图创建Makefile以编译两个程序,但我仍然会遇到错误。

这是我现在正在使用的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <errno.h>

#define TEXT_SIZE 512

int i;

struct shared_data
{
  int data;
  char some_text[TEXT_SIZE];
};


int main()
{
  struct shared_data *ptr;
  const char *shm_name = "comunicator";
  int shm_fd;
  shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, 0666);

  ftruncate(shm_fd, sizeof(struct shared_data));

  ptr = mmap(0, sizeof(struct shared_data), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
  if (ptr == MAP_FAILED) {
    printf("mmap - failed.\n");
    return -1;
  }

ptr->data = 0;

for(i=0; i<10; i++)
{
        while(ptr->data == 1) sleep(1);
        scanf("%s", ptr->some_text);
        ptr->data = 1;
}



  ptr->data = 0;
  sleep(10);
sprintf(ptr->some_text,"Jakis tekst");
 ptr->data = 1;

 sleep(10);

  if (munmap(ptr, sizeof(struct shared_data)) == -1) {
   printf("unmap failed: %s\n", strerror(errno));
   exit(1);
 }

 if (close(shm_fd)) {
   printf("close failed: %s", strerror(errno));
    exit(1);
  }

  return 0;

}

问题可能出在你的 makefile 文件中,而不是你的代码中。 - john
你想为哪个平台编译这个应用程序? - user149341
1
如果您使用的是Linux系统,您可能在链接命令中忘记了-lrt选项(这应该包含在您的问题中)。此处有一个相关的问题 - WhozCraig
你必须使用-lrt链接选项。 - Pablo
在手册页面 http://man7.org/linux/man-pages/man3/shm_open.3.html 上确实如此说明。 - pm100
1个回答

13

在链接阶段没有将库与定义它的位置链接起来。

http://man7.org/linux/man-pages/man3/shm_open.3.html

使用-lrt选项进行链接。

提示:通常,如果您从编译器看到“未定义引用X”的错误,表示您忘记将定义它的库链接进去。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接