C语言 Ubuntu 消息队列生成文件错误



我在 Ubuntu 中 C 语言中的消息队列有问题。我使用VirtualBox来运行Ubuntu。

我采取了错误,即"未定义对mq_open的引用。LD 返回 1 个退出状态"。

我知道有一个与此相同的问题,但我尝试了该解决方案,但没有奏效,所以我想再问一次。请帮忙!

这是我的代码,它真的很简单,但我什至无法编译它。

这是我的丹尼姆。

#include <stdlib.h>
#include <mqueue.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include "sharedMsg.h"
int main()
{
  mqd_t mq;
  mq = mq_open(MQNAME, O_RDWR | O_CREAT, 0666, NULL);
}

这是我的共享Msg.h

struct item{
  char *word;
  int lineNum;
};
#define MQNAME "/sentmsg"

最后这是我的制作文件

all: deneme
deneme: deneme.c
    gcc -g -Wall -o deneme deneme.c -lrt
clean:
    rm -fr *~ *.o 

Makefile 的问题在于您的all目标依赖于demene但指定-lrt的目标称为 demene1 。因此,默认推理规则启动,并尝试在不-lrt的情况下链接demenedeneme1的规则也是错误的,因为它试图创建一个名为deneme的二进制文件,即使该规则应该创建deneme1。若要解决此问题,请将第一行更改为第三行

all: deneme1
deneme1: deneme.c
    gcc -g -Wall -o deneme1 deneme.c -lrt

或第二行

deneme: deneme.c

(注意:OP已经编辑了这个问题,并修复了这个答案之后的Makefile)

你有一个损坏的生成文件。
您甚至看到链接器错误的原因是您可能已经执行了make deneme。在这种情况下,make将尝试使用默认编译器选项编译dename.c(因为它没有找到名为 deneme 的目标),并且默认选项不包括 -lrt

你必须修复你的制作文件(用deneme:替换deneme1:

all: deneme
deneme: deneme.c
    gcc -g -Wall -o deneme deneme.c -lrt
clean:
    rm -f deneme *~ *.o

最新更新