我在 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
的情况下链接demene
。deneme1
的规则也是错误的,因为它试图创建一个名为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