0

I'm trying to run a simple client program using Eclipse Paho C inside Eclipse.

I did the following:
1) Create new project
2) Copy "include" folder and "lib" folder to the project directory
3) Add "include" folder directory to the includes path
4) Link the libraries with the linker as shown in the image below

Project Configuration

However when I build the following code :

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "MQTTClient.h"

#define ADDRESS     "tcp://localhost:1883"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "MQTT Examples"
#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);
    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);
    }
    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);
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}

I get the following:

19:31:16 **** Rebuild of configuration Debug for project MQTT_C_Client ****
Info: Internal Builder is used for build
gcc "-IE:\\WS\\MQTT_C_Client\\includes" -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\main.o" "..\\src\\main.c" 
gcc "-LE:\\WS\\MQTT_C_Client\\libs" -o MQTT_C_Client.exe "src\\main.o" -lpaho-mqtt3a -lpaho-mqtt3as -lpaho-mqtt3c -lpaho-mqtt3cs 
src\main.o: In function `main':
E:\WS\MQTT_C_Client\Debug/../src/main.c:29: undefined reference to `MQTTClient_create'
E:\WS\MQTT_C_Client\Debug/../src/main.c:34: undefined reference to `MQTTClient_connect'
E:\WS\MQTT_C_Client\Debug/../src/main.c:43: undefined reference to `MQTTClient_publishMessage'
E:\WS\MQTT_C_Client\Debug/../src/main.c:47: undefined reference to `MQTTClient_waitForCompletion'
E:\WS\MQTT_C_Client\Debug/../src/main.c:49: undefined reference to `MQTTClient_disconnect'
E:\WS\MQTT_C_Client\Debug/../src/main.c:50: undefined reference to `MQTTClient_destroy'
collect2.exe: error: ld returned 1 exit status

19:31:29 Build Finished (took 12s.643ms)

Any idea what am I missing ?

MChawa
  • 45
  • 5

2 Answers2

0

This is a possible reason for the error. (may not be the right solution depending on the underlying linker)

It's the position of -L relative to -l that's giving you trouble (I had been a bit careless in my observation). From the gcc manpage:

You can mix options and other arguments. For the most part, the order you use doesn't matter. Order does matter when you use several options of the same kind; for example, if you specify -L more than once, the directories are searched in the order specified. Also, the placement of the -l option is significant.

It may make a difference depending on the underlying linker how the -L library searches are scoped. Try to make sure that -L and -l are next to each other without any other directly linked object paths separating them.

So for example,

 gcc -o myprog main.o foo.o bar.o -L/some/path -L/some/other/path -la -lb 

is okay

However,

gcc -o myprog main.o -L/some/path foo.o bar.o -L/some/other/path -la -lb 

is not.

Ahmed Masud
  • 21,655
  • 3
  • 33
  • 58
0

I solved the issue by building the libraries on Windows using Cygwin and used the generated libraries.

MChawa
  • 45
  • 5