How to link a dynamic library in a C/C++ S-Function that also Matlab needs
조회 수: 10(최근 30일)
In a C/C++ S-Function I need functions from a 3rd party dynamic link library. For example I need the function QApplication::aboutQt() from the Qt5Widgets library (Qt5Widgets.dll or libQt5Widgets.so). Matlab/Simulink does also dynamically link to the Qt5Widgets library while delivering that library in e.g. the path matlabroot\bin\win64 or matlabroot/bin/glnxa64. Matlab 2015b and 2016a for example are using Qt version 5.3.0 while I need to use Qt version 5.5.0. Is it possible to use the other Qt libraries?
For example following following S-Function
#define S_FUNCTION_LEVEL 2
#define S_FUNCTION_NAME sfunc_loadlibtest
static void mdlInitializeSizes(SimStruct *S)
int argc = 1;
char* argv = "test";
QApplication app(argc, &argv);
static void mdlInitializeSampleTimes(SimStruct *S)
static void mdlOutputs(SimStruct *S, int_T tid)
static void mdlTerminate(SimStruct *S)
// Required S-function trailer
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#include "cg_sfun.h" /* Code generation registration function */
And run with: sfunc_loadlibtest(0,0,0,0);
Note: the aboutQt() function is only an example. The same problem accures with e.g. the openscenegraph libraries, boost libraries or opencv and many more
Walter Roberson 2016년 11월 15일
Typically it will not work to dynamically link two routines that require different versions of a library.
Sometimes it will work. If an interface has been constructed to be backwards compatible then you might be able to use the newer version, possibly. You are safest using versions where the first two components are the same; for example, 5.3.0 would probably be compatible with 5.3.1 . Whether 5.3 would work with 5.4 or 5.5 is going to depend upon how the authors make use of numbering; for some software authors, incompatibilities are signaled by changes in the first component (so, 5.9 would work with 5.3 but 6.x would not); for others, incompatibilities are signaled by changes in the second component (so 5.3 would not work with 5.4.) And sometimes the numbering is just magical; for example, 5.1 might not work with 5.2 but 5.2 might work with 5.3 or 5.4 but not 5.5, and you cannot always tell from the numbering what is compatible and what is not.