Adding Matlab C/C++ Library to Qt Desktop Application
-
Hi All,
I have created a C shared library using the Matlab C Compiler. I wanted it to be integrated to my Qt Project.
Before adding the library, I first created a standalone C Executable, to see if the code runs. It does. I get Matlab Plots as well. Everything all right till here. But that's not what i want. I need to change the parameters on from the Qt. Hence, the need for the library.
Since I am very new in it, I followed the forums and blogs to get it done. This is essentially what I followed.
http://michael-stengel.com/blog/?p=89
My Project file looks something like this
@
QT += core guiTARGET = seriously
TEMPLATE = appSOURCES += main.cpp
mainwindow.cppHEADERS += mainwindow.h
FORMS += mainwindow.ui
win32-msvc2008: LIBS += -L"C:/Program Files/MATLAB/MATLAB Compiler Runtime/v711/extern/lib/win32/microsoft/" -lmclmcrrt
INCLUDEPATH += "C:/Program Files/MATLAB/MATLAB Compiler Runtime/v711/extern/lib/win32/microsoft"
DEPENDPATH += "C:/Program Files/MATLAB/MATLAB Compiler Runtime/v711/extern/lib/win32/microsoft"
win32: PRE_TARGETDEPS += "C:/Program Files/MATLAB/MATLAB Compiler Runtime/v711/extern/lib/win32/microsoft/mclmcrrt.lib"INCLUDEPATH += "C:/Program Files/MATLAB/MATLAB Compiler Runtime/v711/extern/include"
win32: LIBS += -L$$PWD/../../serious/src/ -lserious
INCLUDEPATH += $$PWD/../../serious/src
DEPENDPATH += $$PWD/../../serious/src
win32: PRE_TARGETDEPS += $$PWD/../../serious/src/serious.lib
@In the code, serious.lib/dll is added as an external binary compiled by Matlab with VS2008 compiler. The Qt Windows libraries are used for compiling the project with VS2008 compiler.
When I try to run the code, the application stops working and it gives me following result : exited with code -1073741819. Segmentation fault seems to be the issue.
Thinking it might be an access violation, I ran Qt as an administrator but to no avail. I don't understand where I am going wrong.
Please help me with this problem.Thanks & Regards
-
Are you initializing the MCR and your library? FYI you don't need to add thee MCR lib path to your INCLUDEPATH.
I am currently developing a Qt app that uses the MCR. I had a similar issue when I was not initializing the MCR and my library correctly. I am generating a shared C++ library with MATLAB Compiler. You mention that you are generating a C library (why not C++ when you are using Qt?); I'm not sure if my approach fits but this is what works in my case.Here is my .pro file:
@
TEMPLATE = app
TARGET = mainextern/include is where my matlab library header file is
INCLUDEPATH += include
extern/include
"C:\Program Files (x86)\MATLAB\MATLAB Compiler Runtime\v81\extern\include"SDV.lib is my MATLAB Compiler generated .lib file
LIBS += extern\lib\SDV.lib
"C:\Program Files (x86)\MATLAB\MATLAB Compiler Runtime\v81\extern\lib\win32\microsoft\mclmcrrt.lib"SDV.h is my MATLAB Compiler generated .h file
HEADERS += include/mainWindow.h
include/ui_MainWindow.h
extern/include/SDV.hFORMS += UIs/MainWindow.ui
win32:DEFINES += NOMINMAX
QT += widgets
Input
SOURCES += src/main.cpp
src/mainWindow.cpp \RESOURCES += resources.qrc
Output
release:DESTDIR = ../build/release
debug: DESTDIR = ../build/debugOBJECTS_DIR = $$DESTDIR/obj
MOC_DIR = $$DESTDIR/moc
RCC_DIR = $$DESTDIR/qrc
UI_DIR = include
@I initialize the MCR and my library in the constructor of MainWindow. I terminate both in the destructor. Here is the code for that:
@
#include "SDV.h"MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{
if (!mclInitializeApplication(NULL,0) || !SDVInitialize())
{
std::cerr << "could not initialize the library properly"<<std::endl;
return;
}setupUi(this);
}MainWindow::~MainWindow()
{
SDVTerminate();
mclTerminateApplication();
}
@ -
How to debug such an application? I got the same problems. I was using MSVC2008 as an IDE on Window XP platform. I could compile and run the application which called matlab routine through dll. But I got an error of "integer divided by zero". I didn't know where the error come from even whether the application entered the matlab subroutine. Could anyone tell me how to debug such an application?
-
I imagine that the divide by zero is happening in your c++ code and not the matlab code. I haven't tried this in a Compiler generated dll from C++ code but here is what happens in MATLAB:
@n = int16(5)
n =
5
d = int16(0)
d =
0
q = n/d
q =
32767
intmax('int16')
ans =
32767
@Check anywhere in your C++ code that you are doing division. Maybe posting your code would help...