CecchinoSMI
CecchinoSMI

Reputation: 169

Error 21 error LNK2019: unresolved external symbol:.... referenced in function:....

I tried to create a .h file starting to a .cpp flie. I'm quite sure that the header is correct, but when i try to use the functions of the .cpp file in an other of my project I have a lot of link problems. So I attached the files here, surely someone can give me some solutions. The first solution of check the properties of the project, properties->linker->additional libraries, I have already done.

there are the .cpp files:

IfacomAmqSender.cpp


#include <activemq/library/ActiveMQCPP.h>
#include <decaf/lang/Thread.h>
#include <decaf/lang/Runnable.h>
#include <decaf/util/concurrent/CountDownLatch.h>
#include <decaf/lang/Integer.h>
#include <decaf/lang/Long.h>
#include <decaf/lang/System.h>
#include <activemq/core/ActiveMQConnectionFactory.h>
#include <activemq/util/Config.h>
#include <cms/Connection.h>
#include <cms/Session.h>
#include <cms/TextMessage.h>
#include <cms/BytesMessage.h>
#include <cms/MapMessage.h>
#include <cms/ExceptionListener.h>
#include <cms/MessageListener.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <memory>


using namespace activemq::core;
using namespace decaf::util::concurrent;
using namespace decaf::util;
using namespace decaf::lang;
using namespace cms;
using namespace std;


class IfacomAmqSender : public ExceptionListener{

private:

    CountDownLatch m_latch;
    CountDownLatch m_doneLatch;
    Connection* m_connection;
    Session* m_session;
    Destination* m_destination;
    MessageConsumer* m_consumer;
    MessageProducer* m_producer;
    std::auto_ptr<TextMessage> m_message;
    long m_waitMillis;
    bool m_useTopic;
    bool m_sessionTransacted;
    std::string m_brokerURI;
    std::string m_destName;
    DeliveryMode m_message_delivery_mode;
    int m_message_priority;

private:

    //IfacomAmqSender(const IfacomAmqSender&);
    //IfacomAmqSender& operator=(const IfacomAmqSender&);

public:

   IfacomAmqSender(const std::string& brokerURI, int numMessages, bool useTopic = false, bool sessionTransacted = false, const std::string& destName = "IFACOM-CMS", int waitMillis = 1000) :
        m_latch(1),
        m_doneLatch(numMessages),
        m_connection(NULL),
        m_session(NULL),
        m_destination(NULL),
        m_consumer(NULL),
        m_waitMillis(waitMillis),
        m_useTopic(useTopic),
        m_sessionTransacted(sessionTransacted),
        m_destName(destName),
        m_brokerURI(brokerURI) {
    }

    IfacomAmqSender(const std::string& brokerURI, bool useTopic = false, bool sessionTransacted = false, const std::string& destName = "IFACOM-CMS") :
        m_latch(1),
        m_doneLatch(1),
        m_connection(NULL),
        m_session(NULL),
        m_destination(NULL),
        m_consumer(NULL),
        m_waitMillis(1000),
        m_useTopic(useTopic),
        m_sessionTransacted(sessionTransacted),
        m_destName(destName),
        m_brokerURI(brokerURI) {
    }


    virtual ~IfacomAmqSender() {
        cleanup();
    }

    void close() {
        this->cleanup();
    }

    void waitUntilReady() {
        m_latch.await();
    }

//------ Init connexion ---------------

    void createConnection()
    {
        // Create a ConnectionFactory
        auto_ptr<ConnectionFactory> connectionFactory(ConnectionFactory::createCMSConnectionFactory(m_brokerURI));

        // Create a Connection
        m_connection = connectionFactory->createConnection();
        m_connection->start();
        m_connection->setExceptionListener(this);
    }

    void createSession()
    {
        // Create a Session
        if (this->m_sessionTransacted == true) {
            m_session = m_connection->createSession(Session::SESSION_TRANSACTED);
        } else {
            m_session = m_connection->createSession(Session::AUTO_ACKNOWLEDGE);
        }
    }

    void createDestination()
    {
        // Create the destination (Topic or Queue)
        if (m_useTopic) {
            m_destination = m_session->createTopic(m_destName);
        } else {
            m_destination = m_session->createQueue(m_destName);
        }
    }

    void createProducer()
    {
        m_producer = m_session->createProducer(m_destination);
        m_producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
    }

    void initConnection() {

        try {

            createConnection();

            // Create the session
            createSession();

            // Create the destination (Topic or Queue)
            createDestination();

            // Create a MessageProducer from the Session to the Topic or Queue
            createProducer();
            m_producer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);

            // Indicate we are ready for messages.
            m_latch.countDown();

            // Wait while asynchronous messages come in.
            m_doneLatch.await(m_waitMillis);

        } catch (CMSException& e) {
            // Indicate we are ready for messages.
            //latch.countDown();
            e.printStackTrace();
        }
    }


    virtual void sendMessage(string text) {
            try {

        std::auto_ptr<TextMessage> message(m_session->createTextMessage(text));
            // to set a property
            ////message->setIntProperty("Integer", ix);
        m_producer->send(message.get());
        message->setCMSTimestamp(System::currentTimeMillis());

        } catch (CMSException& e) {
            e.printStackTrace();
        }
    }


    // Send a ActiveMQ Message
    virtual void sendMessage(std::auto_ptr<TextMessage> amq_message) {
        try {

            amq_message->setCMSTimestamp(System::currentTimeMillis());
            m_producer->send(amq_message.get());

        } catch (CMSException& e) {
            e.printStackTrace();
        }
    }

//--------------------------------------------------

    // If something bad happens you see it here as this class is also been
    // registered as an ExceptionListener with the connection.
    virtual void onException(const CMSException& ex AMQCPP_UNUSED) {
        printf("CMS Exception occurred.  Shutting down client.\n");
        ex.printStackTrace();
        exit(1);
    }

    // Message Priority (0:Lowest - 9:Highest)
    void setPriority(int priority){m_message_priority = priority;}
    int getPriority(){return m_message_priority;}

    // Message Delivery Mode
    void setDeliveryMode(DeliveryMode delivery_mode){m_message_delivery_mode = delivery_mode;}
    DeliveryMode getDeliveryMode(){return m_message_delivery_mode;}

    Session* getSession()
    {
        return m_session;
    }

private:

    void cleanup() {
        if (m_connection != NULL) {
            try {
                m_connection->close();
            } catch (cms::CMSException& ex) {
                ex.printStackTrace();
            }
        }

        // Destroy resources.
        try {
            delete m_destination;
            m_destination = NULL;
            delete m_consumer;
            m_consumer = NULL;
            delete m_session;
            m_session = NULL;
            delete m_connection;
            m_connection = NULL;
        } catch (CMSException& e) {
            e.printStackTrace();
        }
    }

};

mainwindow.cpp file:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "IfacomAmqSender.h"
#include <activemq/library/ActiveMQCPP.h>
#include <decaf/lang/Thread.h>
#include <decaf/lang/Runnable.h>
#include <decaf/util/concurrent/CountDownLatch.h>
#include <decaf/lang/Integer.h>
#include <decaf/lang/Long.h>
#include <decaf/lang/System.h>
#include <activemq/core/ActiveMQConnectionFactory.h>
#include <activemq/util/Config.h>
#include <cms/Connection.h>
#include <cms/Session.h>
#include <cms/TextMessage.h>
#include <cms/BytesMessage.h>
#include <cms/MapMessage.h>
#include <cms/ExceptionListener.h>
#include <cms/MessageListener.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <memory>
#include <qstring.h>
#include <QTextStream>
#include <QMessageBox>


using namespace activemq::core;
using namespace decaf::util::concurrent;
using namespace decaf::util;
using namespace decaf::lang;
using namespace cms;
using namespace std;



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    activemq::library::ActiveMQCPP::initializeLibrary();
    {


    std::string brokerURI;

        brokerURI = "failover://(tcp://localhost:61613?wireFormat=stomp)";      // localhost

       // brokerURI = "failover://(tcp://localhost:61616)";     // localhost

        // Queue name
    std::string destName = "IFACOM-CMS";

    // Queue or Topic 
    bool useTopics = false;         // true=Topic, false=Queue

    // SESSION_TRANSACTED or AUTO_ACKNOWLEDGE
    bool sessionTransacted = false; // if true, commit all messages

    long long startTime = System::currentTimeMillis();

    // ***** Initialisation  **************************************************************
    IfacomAmqSender IfacomMessageBroker(brokerURI, useTopics, sessionTransacted, destName);
    IfacomMessageBroker.initConnection();

    //****** Send message ******************************************************

    std::string text = "My IFaCOM message";
    // Customized message
    try{
        std::auto_ptr<TextMessage> message(IfacomMessageBroker.getSession()->createTextMessage(text));
        message->setCMSTimestamp(System::currentTimeMillis());
        message->setStringProperty("MyProperty", "test");
        IfacomMessageBroker.sendMessage(message);

    } catch (CMSException& e) {
        e.printStackTrace();
    }

    // Simple text message
    IfacomMessageBroker.sendMessage(text);


    long long endTime = System::currentTimeMillis();
    double totalTime = (double)(endTime - startTime) / 1000.0;

    // Close the connection
    IfacomMessageBroker.close();

    ui->label->setText(QString::fromStdString(text));
    }

    // To Do at the end
    activemq::library::ActiveMQCPP::shutdownLibrary();



}

main.cpp file:

#include "ifacomamqsender.h"
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

there are the header files:

IfacomAmqSender.h file:

#ifndef _IfacomAmqSender_h
#define _IfacomAmqSender_h
#include <activemq/library/ActiveMQCPP.h>
#include <decaf/lang/Thread.h>
#include <decaf/lang/Runnable.h>
#include <decaf/util/concurrent/CountDownLatch.h>
#include <decaf/lang/Integer.h>
#include <decaf/lang/Long.h>
#include <decaf/lang/System.h>
#include <activemq/core/ActiveMQConnectionFactory.h>
#include <activemq/util/Config.h>
#include <cms/Connection.h>
#include <cms/Session.h>
#include <cms/TextMessage.h>
#include <cms/BytesMessage.h>
#include <cms/MapMessage.h>
#include <cms/ExceptionListener.h>
#include <cms/MessageListener.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <memory>

using namespace activemq::core;
using namespace decaf::util::concurrent;
using namespace decaf::util;
using namespace decaf::lang;
using namespace cms;
using namespace std;

 class IfacomAmqSender{

private:

    CountDownLatch m_latch;
    CountDownLatch m_doneLatch;
    Connection* m_connection;
    Session* m_session;
    Destination* m_destination;
    MessageConsumer* m_consumer;
    MessageProducer* m_producer;
    std::auto_ptr<TextMessage> m_message;
    long m_waitMillis;
    bool m_useTopic;
    bool m_sessionTransacted;
    std::string m_brokerURI;
    std::string m_destName;
    DeliveryMode m_message_delivery_mode;
    int m_message_priority;
    IfacomAmqSender(const IfacomAmqSender&);
    IfacomAmqSender& operator=(const IfacomAmqSender&);



public:

    IfacomAmqSender(const std::string&, int, bool, bool, const std::string&, int);
    IfacomAmqSender(const std::string&, bool, bool, const std::string&);

    virtual ~IfacomAmqSender();
    void close();
    void waitUntilReady();
    void cleanup();

    // KH
    void createConnection();
    void createSession();
    void createDestination();
    void createProducer();
    void initConnection();

    virtual void sendMessage(string);

    // Send a ActiveMQ Message
    virtual void sendMessage(std::auto_ptr<TextMessage>);


//--------------------------------------------------

    // If something bad happens you see it here as this class is also been
    // registered as an ExceptionListener with the connection.
    virtual void onException(const CMSException&) ;

    // Message Priority (0:Lowest - 9:Highest)
    void setPriority(int);
    int getPriority();

    // Message Delivery Mode
    void setDeliveryMode(DeliveryMode);
    DeliveryMode getDeliveryMode();

    Session* getSession();

};
#endif

mainwindow.h file:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

THE ERRORS ARE:

Error   21  error LNK2019: unresolved external symbol "public: __thiscall IfacomAmqSender::IfacomAmqSender(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool,bool,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0IfacomAmqSender@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N10@Z) referenced in function "private: void __thiscall MainWindow::on_pushButton_clicked(void)" (?on_pushButton_clicked@MainWindow@@AAEXXZ)   C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\mainwindow.obj  GUI-CMS
Error   22  error LNK2019: unresolved external symbol "public: virtual __thiscall IfacomAmqSender::~IfacomAmqSender(void)" (??1IfacomAmqSender@@UAE@XZ) referenced in function __catch$?on_pushButton_clicked@MainWindow@@AAEXXZ$0  C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\mainwindow.obj  GUI-CMS
Error   23  error LNK2019: unresolved external symbol "public: void __thiscall IfacomAmqSender::close(void)" (?close@IfacomAmqSender@@QAEXXZ) referenced in function __catch$?on_pushButton_clicked@MainWindow@@AAEXXZ$0    C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\mainwindow.obj  GUI-CMS
Error   24  error LNK2019: unresolved external symbol "public: void __thiscall IfacomAmqSender::initConnection(void)" (?initConnection@IfacomAmqSender@@QAEXXZ) referenced in function "private: void __thiscall MainWindow::on_pushButton_clicked(void)" (?on_pushButton_clicked@MainWindow@@AAEXXZ)   C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\mainwindow.obj  GUI-CMS
Error   25  error LNK2019: unresolved external symbol "public: virtual void __thiscall IfacomAmqSender::sendMessage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?sendMessage@IfacomAmqSender@@UAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function __catch$?on_pushButton_clicked@MainWindow@@AAEXXZ$0   C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\mainwindow.obj  GUI-CMS
Error   26  error LNK2019: unresolved external symbol "public: virtual void __thiscall IfacomAmqSender::sendMessage(class std::auto_ptr<class cms::TextMessage>)" (?sendMessage@IfacomAmqSender@@UAEXV?$auto_ptr@VTextMessage@cms@@@std@@@Z) referenced in function "private: void __thiscall MainWindow::on_pushButton_clicked(void)" (?on_pushButton_clicked@MainWindow@@AAEXXZ)  C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\mainwindow.obj  GUI-CMS
Error   27  error LNK2019: unresolved external symbol "public: class cms::Session * __thiscall IfacomAmqSender::getSession(void)" (?getSession@IfacomAmqSender@@QAEPAVSession@cms@@XZ) referenced in function "private: void __thiscall MainWindow::on_pushButton_clicked(void)" (?on_pushButton_clicked@MainWindow@@AAEXXZ)    C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\mainwindow.obj  GUI-CMS
Error   28  error LNK1120: 7 unresolved externals   C:\Users\Marco\Desktop\Activemq\ReleaseVersions\GUI-CMS\debug\\GUI-CMS.exe  GUI-CMS

Upvotes: 2

Views: 1173

Answers (2)

PMF
PMF

Reputation: 17298

Your IfacomAmqSender constructor is declared as follows:

IfacomAmqSender(const std::string&, int, bool, bool, const std::string&, int);

The implementation header is as follows:

IfacomAmqSender(const std::string& brokerURI, int numMessages, bool useTopic = false, bool sessionTransacted = false, const std::string& destName = "IFACOM-CMS", int waitMillis = 1000);

So your implementation declares standard parameter values, while the declaration doesn't. So it's quite random whether at the place of any call, it is known that the function can take standard arguments. Either remove all standard arguments or make sure you declare them the same everywhere, both in declaration and implementation. (My C++ is a bit rusted, I think the main place for it would be the declaration in the .h file).

Oh, and hell, yes: See the other answer. The implementation has another class header around it. So you're actually declaring two classes with the same name. The CPP file usually does not have any class X : public Y declarations in it.

Upvotes: 0

Vlad from Moscow
Vlad from Moscow

Reputation: 311088

I do not understand your code. it has two different definitions of class IfacomAmqSender. The first one is

class IfacomAmqSender : public ExceptionListener{

and the second one is

class IfacomAmqSender{

I think the reason of the errors is these duplications of class IfacomAmqSender

Upvotes: 1

Related Questions