Comilare con GCC probramma in C con librerie MQTT paho

di il
6 risposte

Comilare con GCC probramma in C con librerie MQTT paho

Ciao a tutti.
Vorrei provare ad utilizzare il protocollo MQTT in un programma in c, sto utilizzando un pc con linux mint.
Ho installato le librerie build-essential e libpaho-mqtt-dev
Ho copiato dal sito di eclipse un programmino id prova, questo:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "MQTTClient.h"
#define ADDRESS     "tcp://broker.emqx.io:1883"
#define CLIENTID    "emqx_test"
#define TOPIC       "testtopic/1"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L
int main(int argc, char* argv[])
{
   MQTTClient client;
   MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
   MQTTClient_message pubmsg = MQTTClient_message_initializer;
   MQTTClient_deliveryToken token;
   int rc;
   MQTTClient_create(&client, ADDRESS, CLIENTID,
       MQTTCLIENT_PERSISTENCE_NONE, NULL);
 
   // MQTT Connection parameters
   conn_opts.keepAliveInterval = 20;
   conn_opts.cleansession = 1;
   if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
   {
       printf("Failed to connect, return code %d\n", rc);
       exit(-1);
   }
 
   // Publish message
   pubmsg.payload = PAYLOAD;
   pubmsg.payloadlen = strlen(PAYLOAD);
   pubmsg.qos = QOS;
   pubmsg.retained = 0;
   MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
   printf("Waiting for up to %d seconds for publication of %s\n"
           "on topic %s for client with ClientID: %s\n",
           (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
   rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
   printf("Message with delivery token %d delivered\n", token);
 
   // Disconnect
   MQTTClient_disconnect(client, 10000);
   MQTTClient_destroy(&client);
   return rc;
}

Ma quando lo compilo gcc mi dice:

$ gcc mqtt.c
/usr/bin/ld: /tmp/cccyE78R.o: in function `main':
mqtt.c:(.text+0x18d): undefined reference to `MQTTClient_create'
/usr/bin/ld: mqtt.c:(.text+0x1ba): undefined reference to `MQTTClient_connect'
/usr/bin/ld: mqtt.c:(.text+0x23f): undefined reference to `MQTTClient_publishMessage'
/usr/bin/ld: mqtt.c:(.text+0x28f): undefined reference to `MQTTClient_waitForCompletion'
/usr/bin/ld: mqtt.c:(.text+0x2c5): undefined reference to `MQTTClient_disconnect'
/usr/bin/ld: mqtt.c:(.text+0x2d4): undefined reference to `MQTTClient_destroy'
collect2: error: ld returned 1 exit status

cosa significa undefined reference? Ho verificato il file MQTTClient.h si trova in /usr/include

avete suggerimenti? Caio

6 Risposte

  • Re: Comilare con GCC probramma in C con librerie MQTT paho

    Il .h è solo un file include ma devi indicare la libreria o il linker non saprà dove sono le funzioni e darà quell'errore.

    https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

  • Re: Comilare con GCC probramma in C con librerie MQTT paho

    Ciao e grazie,

    allora ho cercato le librerie di mqtt e ho trovato questi file in /usr/lib/x86_64-linux-gnu:

    libpaho-mqtt3a.a         libpaho-mqtt3as.so.1      libpaho-mqtt3c.so.1.3.9
    libpaho-mqtt3as.a        libpaho-mqtt3as.so.1.3.9  libpaho-mqtt3cs.so
    libpaho-mqtt3a.so        libpaho-mqtt3c.a          libpaho-mqtt3cs.so.1
    libpaho-mqtt3a.so.1      libpaho-mqtt3cs.a         libpaho-mqtt3cs.so.1.3.9
    libpaho-mqtt3a.so.1.3.9  libpaho-mqtt3c.so
    libpaho-mqtt3as.so       libpaho-mqtt3c.so.1

    ho provato un po' con tutti questi file e un po' con tutte le combinazioni ma il risultato è sempre questo:

    $ gcc mqtt.c -l/usr/lib/x86_64-linux-gnu/libpaho-mqtt3c.so
    /usr/bin/ld: impossibile trovare -l/usr/lib/x86_64-linux-gnu/libpaho-mqtt3c.so: File o directory non esistente
    collect2: error: ld returned 1 exit status

    forse non sono queste le librerie di C ? O non è il sistema corretto di allegarle?

  • Re: Comilare con GCC probramma in C con librerie MQTT paho

    Prova

    gcc mqtt.c -L/usr/lib/x86_64-linux-gnu -lpaho-mqtt3c
  • Re: Comilare con GCC probramma in C con librerie MQTT paho

    GRANDE!!!

    Ha compilato tutto senza dare nessun problema, grazie mille.

    Ora ho capito il parametro -L che, ho provato non è indispensabile probabilmente la dir x86_64-linux-gnu è in qualche path.

    Ma come si fa a sapere che il nome della libreria è paho-mqtt3c?

  • Re: Comilare con GCC probramma in C con librerie MQTT paho

    L'opzione -l* carica (dal percorso di default o da quelli che hai aggiunto con -L) la libreria statica con il nome lib*.a o la libreria dinamica con il nome lib*.so, quindi se ti serviva libpaho-mqtt3c.so (se ci sono entrambe viene data, comunque, la preferenza a .so) la riga di comando deve contenere -lpaho-mqtt3c .

    Poi quale versione ti serva davvero tra quelle che hai installato (3a, 3c etc.), per quello devi spulciare la documentazione 

  • Re: Comilare con GCC probramma in C con librerie MQTT paho

    Grazie mille

Devi accedere o registrarti per scrivere nel forum
6 risposte