matlab x64 mex,matlab的mex编译与mxCreateNumericArray

C++ mex编译

首先用cd命令在matlab中转到待编译文件的位置,在comman窗口输入mex -setup,点击 mex -setup C++,然后mex file.cpp即可编译

98f7664d86ec

64位系统下混合编程的编译错误

在编译时遇到了一些编译报错,据说是可以在32位系统下编译成功,但64位系统会报错,问题及解决如下:

问题1

error C2440: “初始化”: 无法从“const mwSize ”转换为“const int”

解决:

将C++代码中的“const int *”改为“const mwSize *”

// 问题1

const int *dims = mxGetDimensions(prhs[2]); //原版

const mwSize *dims = mxGetDimensions(prhs[2]); //修改版

解决:

改写为 const mwSize outDims[3] = {Y_dimx,Y_dimy,Y_dimz};

// 问题2

int dims[3] = {imHeight, imWidth, nChannels}; //原版

mwSize dims[3] = {imHeight, imWidth, nChannels}; //修改版

问题3

error LNK2019: 无法解析的外部符号 "public: static void __cdecl OpticalFlow::Coarse2FineFlow(class Image&,class Image &, class Image &,class Image const &,class Image const &,double,double,int,int,int,int)" (?Coarse2FineFlow@OpticalFlow@@SAXAEAV$Image@N@@00AEBV2@1NNHHHH@Z),该符号在函数 mexFunction 中被引用

Coarse2FineTwoFrames.mexw64 : fatal error LNK1120: 1 个无法解析的外部命令

参考:

缺少库文件原因参考

混合编程MATLAB引擎的一些错误-error LNK2019: 无法解析的外部符号

C MEX 文件应用程序

error LNK2019: 无法解析的外部符号

error LNK2019 可能原因:

只包含了头文件,只有这个函数的声明,没有包含这个[函数]的实现(实现一般放在cpp文件中的)。所以只能通过编译,连接不成功。

另一个原因是函数的声明和实现都放在头文件中了。一般要把声明放头文件中,实现放在cpp文件中。这样每个#include该头文件的文件都会有一份该函数的实现,连接的时候,连接器不知道连接哪一个实现,于是报错。

链接库没有加载, 缺少库文件,在头文件后面加入#pragma comment( lib, "*****.lib")就OK

VS或MATLAB配置错误. 库不对,如库的调用规范(__thiscall是一种规范之一)不同,或者配置不同(有些库是win32,有些是x64的)

解决:

检查发现 A.cpp中函数调用了头文件B.h中定义的类OpticalFlow的非静态成员函数Coarse2FineFlow. 该函数在B.h中声明, 在B.cpp中定义. 编译过程中无法读到B.cpp中的定义,因此无法解析. 当把B.cpp中定义复制到B.h中后, 就可以解析了. 类似与C++ 编写构造函数,已经在.h文件中声明和.cpp文件中定义,提示无法解析的外部命令 这个问题.

对于多个文件相互调用函数的情况, 显然无法通过复制从根本上解决问题.

可以通过将include的.h改为.cpp通过编译.

如果是#include "XX,h",则会出现“error LNK2019: 无法解析的外部符号”

如果是#include "XX.cpp",则可以顺利编译通过。想来是因为引用 .h 文件导致找不到.cpp中的定义,而引用.cpp可以通过.cpp找到.h(.cpp有对.h的include)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值