Ubuntu 消息队列 Makefile 错误

Ubuntu Message Queue Makefile Error

我在 Ubuntu 中遇到 C 中消息队列的问题。我用 VirtualBox 来 运行 Ubuntu.

我记错了 "undefined reference to mq_open. ld returned 1 exit status"。

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

这是我的代码,真的很简单,但我连编译都不会。

这是我的 deneme.c

#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);
}

这是我的sharedMsg.h

struct item{
  char *word;
  int lineNum;
};

#define MQNAME "/sentmsg"

最后这是我的 MakeFile

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

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

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

您必须修复您的 Makefile(将 deneme1: 替换为 deneme:

all: deneme

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

clean:
    rm -f deneme *~ *.o

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

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

或第二行到

deneme: deneme.c