QT调用自己写的matlab的dll库,出现编译失败问题。

最近使用matlab2018a,自己编写.m文件,并生成C++库,目的是为了让QT调用自己写的matlab库,QT版本为5.14.0
这是我的matlab中.m文件中的代码,文件名为add.m

function a = add(b, c)
    a = b + c;
end

文件这几行代码,保存为.m文件,编译环境选择了MinGW,和QT编译环境相同,使用matlab生成了C++库,如下图

img


生成该库时,会自动生成add.h add.dll add.lib文件,matlab会自动生成addInitialize函数和addTerminate函数,意义为初始化和结束,代码如下

//
// MATLAB Compiler: 6.6 (R2018a)
// Date: Tue Dec 14 18:08:23 2021
// Arguments:
// "-B""macro_default""-W""cpplib:add,all""-T""link:lib""-d""C:\Users\chenyuan\D
// esktop\add\for_testing""-v""C:\Users\chenyuan\Desktop\add.m"
//

#ifndef __add_h
#define __add_h 1

#if defined(__cplusplus) && !defined(mclmcrrt_h) && defined(__linux__)
#  pragma implementation "mclmcrrt.h"
#endif
#include "mclmcrrt.h"
#include "mclcppclass.h"
#ifdef __cplusplus
extern "C" {
#endif

/* This symbol is defined in shared libraries. Define it here
 * (to nothing) in case this isn't a shared library. 
 */
#ifndef LIB_add_C_API 
#define LIB_add_C_API /* No special import/export declaration */
#endif

/* GENERAL LIBRARY FUNCTIONS -- START */

extern LIB_add_C_API 
bool MW_CALL_CONV addInitializeWithHandlers(
       mclOutputHandlerFcn error_handler, 
       mclOutputHandlerFcn print_handler);

extern LIB_add_C_API 
bool MW_CALL_CONV addInitialize(void);

extern LIB_add_C_API 
void MW_CALL_CONV addTerminate(void);

extern LIB_add_C_API 
void MW_CALL_CONV addPrintStackTrace(void);

/* GENERAL LIBRARY FUNCTIONS -- END */

/* C INTERFACE -- MLX WRAPPERS FOR USER-DEFINED MATLAB FUNCTIONS -- START */

extern LIB_add_C_API 
bool MW_CALL_CONV mlxAdd(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);

/* C INTERFACE -- MLX WRAPPERS FOR USER-DEFINED MATLAB FUNCTIONS -- END */

#ifdef __cplusplus
}
#endif


/* C++ INTERFACE -- WRAPPERS FOR USER-DEFINED MATLAB FUNCTIONS -- START */

#ifdef __cplusplus

/* On Windows, use __declspec to control the exported API */
#if defined(_MSC_VER) || defined(__MINGW64__)

#ifdef EXPORTING_add
#define PUBLIC_add_CPP_API __declspec(dllexport)
#else
#define PUBLIC_add_CPP_API __declspec(dllimport)
#endif

#define LIB_add_CPP_API PUBLIC_add_CPP_API

#else

#if !defined(LIB_add_CPP_API)
#if defined(LIB_add_C_API)
#define LIB_add_CPP_API LIB_add_C_API
#else
#define LIB_add_CPP_API /* empty! */ 
#endif
#endif

#endif

extern LIB_add_CPP_API void MW_CALL_CONV add(int nargout, mwArray& a, const mwArray& b, const mwArray& c);

/* C++ INTERFACE -- WRAPPERS FOR USER-DEFINED MATLAB FUNCTIONS -- END */
#endif

#endif

通过网上所查资料,修改QT的.pro文件,将该matlab库链接到了QT上,并开始调用上面.m文件中的add函数,编译出现错误,错误如下图

img


在网上查了很久,最后得出结论为链接库未成功的问题,于是,我把链接库的代码注释掉,如下图:

img


再次编译:

img


可以发现,addInitialize函数和addTerminate函数调用也失败了,所以我认为,我应该成功的链接上库了,但为什么只有我自己写的add函数不生效呢,请问大家有遇到过类似的问题吗,麻烦解答一下,谢谢啦!

你除了添加-ladd外,还要添加matlab sdk的库mclmcrrt.lib, 因为你引用了mwArray是来自matlab SDK