【问题标题】:Ubuntu Message Queue Makefile ErrorUbuntu 消息队列 Makefile 错误
【发布时间】:2016-05-29 21:31:00
【问题描述】:

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

我收到错误,即“未定义对 mq_open 的引用。ld 返回 1 个退出状态”。

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

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

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

【问题讨论】:

  • 只是为了确定,你已经执行了sudo apt-get install build-essential?你的 Makefile 坏了。 all: 需要deneme,但你提供了deneme1!
  • 是的,我执行了 build -essential 甚至再次确定,我输入这个并再次安装

标签: c ubuntu makefile message-queue


【解决方案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

【讨论】:

  • 非常感谢,我更改了第二行,但仍然报同样的错误
  • 您在构建程序时输入了什么?只是make?你能告诉我你更正的makefile吗?
  • 是的,我只写了“make deneme”,但它无法编译它,我也更正了我的问题中的 makefile
  • @IremHerguner 确保gcc -g ... 行的前缀是制表符,而不是空格! Makefile 要求您使用制表符进行缩进,空格可能不起作用。
  • 我们想要它,我们需要它。必有贵重。他们从我们这里偷走了它。偷偷摸摸的小@FUZxxl。邪恶的,狡猾的,虚假的! (J.R.R.托尔金)。 ;)
【解决方案2】:

(注意: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

【讨论】:

  • 非常感谢,我将第二行改为“deneme”,但仍然报同样的错误
  • 手动执行gcc deneme.c -o deneame -lrt会编译吗?
  • 是的! ,它编译甚至运行,但这怎么可能呢?我怎样才能修复我的makefile?
  • 您的 Makefile 中一定有错误。也许您使用了空格而不是制表符。请注意,制表符是 Makefile 语法中非常重要的一部分。所有命令行必须以制表符开头。
  • 你可以试试这个 Makefile 以确保:pastebin.com/raw/DwAzfWSd/Makefile
猜你喜欢
  • 2013-07-18
  • 2013-12-06
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2015-09-17
相关资源
最近更新 更多