2

I'm facing a tough problem adding the static library libengine.lib from Matlab to a neq QT project.

As I read from some blogs, I have to include both the engine.h header and the libengine.lib library to the .pro file. But when I build and run the project it seems that QT is not able to find the engOpen function of the library.

Here is my (basic) code. classe file is, for now, an empty class. The main.cpp file contains example code which is taken from Matlab tutorial, so I guess it is not a problem.

//.pro file

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Progetto
TEMPLATE = app

CONFIG += staticlib


SOURCES += main.cpp\
        classe.cpp

FORMS    += classe.ui

INCLUDEPATH += "C:/Users/Zeno/Desktop/M_libraries"

LIBS += "C:/Users/Zeno/Desktop/M_libraries/libeng.lib"

HEADERS  += classe.h \
    ../../M_libraries/engine.h

//main.cpp

#include "classe.h"
#include <QApplication>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#define  BUFSIZE 256

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Engine *ep;
        mxArray *T = NULL, *result = NULL;
        char buffer[BUFSIZE+1];
        double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };

        /*
         * Call engOpen with a NULL string. This starts a MATLAB process
         * on the current host using the command "matlab".
         */
        if (!(ep = engOpen(""))) {
            fprintf(stderr, "\nCan't start MATLAB engine\n");
            return EXIT_FAILURE;
        }

        /*
         * PART I
         *
         * For the first half of this demonstration, we will send data
         * to MATLAB, analyze the data, and plot the result.
         */

        /*
         * Create a variable for our data
         */
        T = mxCreateDoubleMatrix(1, 10, mxREAL);
        memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));
        /*
         * Place the variable T into the MATLAB workspace
         */
        engPutVariable(ep, "T", T);

        /*
         * Evaluate a function of time, distance = (1/2)g.*t.^2
         * (g is the acceleration due to gravity)
         */
        engEvalString(ep, "D = .5.*(-9.8).*T.^2;");

        /*
         * Plot the result
         */
        engEvalString(ep, "plot(T,D);");
        engEvalString(ep, "title('Position vs. Time for a falling object');");
        engEvalString(ep, "xlabel('Time (seconds)');");
        engEvalString(ep, "ylabel('Position (meters)');");

        /*
         * use fgetc() to make sure that we pause long enough to be
         * able to see the plot
         */
        printf("Hit return to continue\n\n");
        fgetc(stdin);
        /*
         * We're done for Part I! Free memory, close MATLAB figure.
         */
        printf("Done for Part I.\n");
        mxDestroyArray(T);
        engEvalString(ep, "close;");


        /*
         * PART II
         *
         * For the second half of this demonstration, we will request
         * a MATLAB string, which should define a variable X.  MATLAB
         * will evaluate the string and create the variable.  We
         * will then recover the variable, and determine its type.
         */

        /*
         * Use engOutputBuffer to capture MATLAB output, so we can
         * echo it back.  Ensure first that the buffer is always NULL
         * terminated.
         */

        buffer[BUFSIZE] = '\0';
        engOutputBuffer(ep, buffer, BUFSIZE);
        while (result == NULL) {
            char str[BUFSIZE+1];
            /*
             * Get a string input from the user
             */
            printf("Enter a MATLAB command to evaluate.  This command should\n");
            printf("create a variable X.  This program will then determine\n");
            printf("what kind of variable you created.\n");
            printf("For example: X = 1:5\n");
            printf(">> ");

            fgets(str, BUFSIZE, stdin);

            /*
             * Evaluate input with engEvalString
             */
            engEvalString(ep, str);

            /*
             * Echo the output from the command.
             */
            printf("%s", buffer);

            /*
             * Get result of computation
             */
            printf("\nRetrieving X...\n");
            if ((result = engGetVariable(ep,"X")) == NULL)
              printf("Oops! You didn't create a variable X.\n\n");
            else {
            printf("X is class %s\t\n", mxGetClassName(result));
            }
        }

        /*
         * We're done! Free memory, close MATLAB engine and exit.
         */
        printf("Done!\n");
        mxDestroyArray(result);
        engClose(ep);

        return EXIT_SUCCESS;

    Classe w;
    w.show();



    return a.exec();
}

This is the error I face:

undefined reference to 'engOpen' in main.cpp
zen26
  • 21
  • 1

0 Answers0