shadow.sa 2021-12-14 19:10 采纳率: 0%
浏览 307
已结题

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函数不生效呢,请问大家有遇到过类似的问题吗,麻烦解答一下,谢谢啦!

  • 写回答

1条回答 默认 最新

  • _GX_ 2021-12-14 19:43
    关注
    获得5.00元问题酬金

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

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 创建了问题 12月14日

悬赏问题

  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据
  • ¥15 关于树的路径求解问题
  • ¥15 yolo在训练时候出现File "D:\yolo\yolov5-7.0\train.py"line 638,in <module>
  • ¥30 戴尔inspiron独显直连
  • ¥15 进行一项代码设计遇到问题
  • ¥15 Mutisim中关于74LS192N计数器芯片设计(计数器)
  • ¥50 fastadmin后台无法删除文件
  • ¥15 oracle查询Socket read timed out错误