Ubuntu消息队列Makefile错误

时间:2016-02-17 22:41:42

标签: c ubuntu makefile message-queue

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

我接受了错误,这是"对mq_open的未定义引用。 ld返回1退出状态"。

我知道有同样的问题,但我尝试了这个解决方案,但它没有用,所以我想再问一次。请帮忙!

这是我的代码,它非常简单,但我甚至无法编译它。

这是我的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 

2 个答案:

答案 0 :(得分:1)

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

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

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

all: deneme

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

clean:
    rm -f deneme *~ *.o

答案 1 :(得分:1)

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