对 'shm_open' 的未定义引用
undefined reference to 'shm_open'
我正在尝试使用共享内存制作一个简单的通信器。
它应该能够写一些文本并将其保存在共享内存中。
有人可以向我解释为什么我会收到错误消息:
undefined reference to `shm_open'
collect2: error: ld returned 1 exit status
我试图为两个程序创建 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;
}
您没有 link 在 link 阶段定义的库中使用它。
http://man7.org/linux/man-pages/man3/shm_open.3.html
Link 与 -lrt
ETA 通常,如果您从编译器中看到 "undefined reference to X" 错误,则您忘记了在定义它的库中 link。
我正在尝试使用共享内存制作一个简单的通信器。
它应该能够写一些文本并将其保存在共享内存中。
有人可以向我解释为什么我会收到错误消息:
undefined reference to `shm_open'
collect2: error: ld returned 1 exit status
我试图为两个程序创建 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;
}
您没有 link 在 link 阶段定义的库中使用它。
http://man7.org/linux/man-pages/man3/shm_open.3.html
Link 与 -lrt
ETA 通常,如果您从编译器中看到 "undefined reference to X" 错误,则您忘记了在定义它的库中 link。