Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译Paho MQTT C客户机库_C_Mqtt_Paho - Fatal编程技术网

编译Paho MQTT C客户机库

编译Paho MQTT C客户机库,c,mqtt,paho,C,Mqtt,Paho,我想将[Paho MQTT C客户机库][1]集成到我的一个C程序中。由于我来自EE,我发现很难完成这项任务。然而,我的努力和我的问题如下所述 目的是简单地使用用户名、密码,并使用C程序订阅特定的MQTT主题。如果这样做了,我就可以继续做剩下的事情,比如把数据保存到一个.txt文件中,等等,我对C语言完全熟悉 由于我有电子方面的背景,我对编译类似这样的复杂项目并使其正常工作的熟悉程度充其量也不是很高,但我真的很想达到这一点 我知道如何使用“makeall”编译小项目,并使用生成的二进制可执行文件

我想将[Paho MQTT C客户机库][1]集成到我的一个C程序中。由于我来自EE,我发现很难完成这项任务。然而,我的努力和我的问题如下所述

目的是简单地使用用户名、密码,并使用C程序订阅特定的MQTT主题。如果这样做了,我就可以继续做剩下的事情,比如把数据保存到一个.txt文件中,等等,我对C语言完全熟悉

由于我有电子方面的背景,我对编译类似这样的复杂项目并使其正常工作的熟悉程度充其量也不是很高,但我真的很想达到这一点

我知道如何使用“makeall”编译小项目,并使用生成的二进制可执行文件来使用此类软件。我只是简单地做,把一切弄干净

然而,对我来说,编辑一个图书馆的想法没有意义。为什么我首先需要编译任何库?通常,当我编写C程序时,我会通过UISS(include“library2.h”)集成其他人的库。通过这种方法,我能够调用该库中的函数并完成任务。为什么我们不能以同样的方式使用泛美卫生组织?我不明白为什么Paho MQTT C库需要编译。我想知道这其中的技术原因

其次,也是最重要的一点,如果您能为我提供一步一步的指导,让我编写一个简单的C程序,它可以订阅我的MQTT服务器,以打印出在该主题中发布的消息,我将不胜感激。我使用Ubuntu 14.10 LTS

我知道这个问题可能是一个非常基本的问题。我已经向实验室里的其他人询问了这个问题的答案,还尝试了摆弄[1]上的例子

当我这么做的时候,我会收到很多错误信息,我似乎无法让它正常工作。也许你们中的一个可以通过适当的指导步骤为我的客户提供一些帮助

我非常感谢你在这方面的努力。这对我有很大帮助

更新: 根据Gaurav Pathak的要求,我将我的错误张贴在下面

步骤1:我从 github.com/eclipse/paho.mqtt.c

步骤2:我进入/home/user/paho.mqtt.c/并运行makecleanmakeall

步骤3:然后,我复制了side/home/user/paho.mqtt.c/src中提供的以下示例代码。下面给出了这个示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS     "tcp://localhost:1883"
#define CLIENTID    "ExampleClientSub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L
volatile MQTTClient_deliveryToken deliveredtoken;
void delivered(void *context, MQTTClient_deliveryToken dt)
{
    printf("Message with token value %d delivery confirmed\n", dt);
    deliveredtoken = dt;
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    int i;
    char* payloadptr;
    printf("Message arrived\n");
    printf("     topic: %s\n", topicName);
    printf("   message: ");
    payloadptr = message->payload;
    for(i=0; i<message->payloadlen; i++)
    {
        putchar(*payloadptr++);
    }
    putchar('\n');
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}
void connlost(void *context, char *cause)
{
    printf("\nConnection lost\n");
    printf("     cause: %s\n", cause);
}
int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;
    int ch;
    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;
    MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
           "Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);
    MQTTClient_subscribe(client, TOPIC, QOS);
    do
    {
        ch = getchar();
    } while(ch!='Q' && ch != 'q');
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}
[1] :eclipse dot org/paho/files/mqttdoc/MQTTClient/html/index.html

然而,对我来说,编辑一个图书馆的想法没有意义

从源代码编译库是您需要做的第一件事。即使您不想编译库来创建存档
。一个
文件,您也需要在项目中包含同一库的源代码(*.c和*h文件)

为什么我首先需要编译任何库

很好的问题!答案是,要找到一个针对特定处理器体系结构的预编译库并不容易。您可能会获得x86或x64的预编译库,但很难找到其他体系结构(如Power PC、ARM等)的预编译库。因此,最好的方法是下载源代码,或者从中创建一个库以静态链接到您的项目,或者直接将源代码包含在您现有的项目中并与您的项目一起编译

通常,当我编写C程序时,我通过 包括“library2.h”

您不需要将库的源代码链接到您的项目吗?仅包含标题不会链接库。我想您首先需要了解编译过程的步骤,尤其是链接器和链接过程的意义。 请阅读本文,了解程序是如何编译和链接的。 另外,请阅读本文以了解库文件和头文件之间的区别

当我这么做的时候,我会收到很多错误信息,我就是不能 看来这能奏效

如果您提供您的代码并告诉我们您的具体错误,那么我们可能会提供帮助

然而,对我来说,编辑一个图书馆的想法没有意义

从源代码编译库是您需要做的第一件事。即使您不想编译库来创建存档
。一个
文件,您也需要在项目中包含同一库的源代码(*.c和*h文件)

为什么我首先需要编译任何库

很好的问题!答案是,要找到一个针对特定处理器体系结构的预编译库并不容易。您可能会获得x86或x64的预编译库,但很难找到其他体系结构(如Power PC、ARM等)的预编译库。因此,最好的方法是下载源代码,或者从中创建一个库以静态链接到您的项目,或者直接将源代码包含在您现有的项目中并与您的项目一起编译

通常,当我编写C程序时,我通过 包括“library2.h”

您不需要将库的源代码链接到您的项目吗?仅包含标题不会链接库。我想您首先需要了解编译过程的步骤,尤其是链接器和链接过程的意义。 请阅读本文,了解程序是如何编译和链接的。 另外,请阅读本文以了解库文件和头文件之间的区别

当我这么做的时候,我会收到很多错误信息,我就是不能 看来这能奏效


如果您提供代码并告诉我们您的具体错误,我们可能会提供帮助。

非常感谢您的回答Gaurav Pathak。我确实更新了我的答案,使之更有意义
user@userpc:~/paho.mqtt.c/src$ gcc client.c -o client
/tmp/ccEkSjap.o: In function `msgarrvd':
client.c:(.text+0xc5): undefined reference to `MQTTClient_freeMessage'
client.c:(.text+0xd1): undefined reference to `MQTTClient_free'
/tmp/ccEkSjap.o: In function `main':
client.c:(.text+0x1eb): undefined reference to `MQTTClient_create'
client.c:(.text+0x21d): undefined reference to `MQTTClient_setCallbacks'
client.c:(.text+0x233): undefined reference to `MQTTClient_connect'
client.c:(.text+0x29a): undefined reference to `MQTTClient_subscribe'
client.c:(.text+0x2cb): undefined reference to `MQTTClient_disconnect'
client.c:(.text+0x2da): undefined reference to `MQTTClient_destroy'
collect2: error: ld returned 1 exit status