我在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
答案 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