MATLAB和C语言混合编程问题

最近在用VS和MATLAB进行混合编程,具体流程大致是这样的:首先用C/C++在循环语句执行效率方面的优势读取HDF文件并做相关处理,然后将处理后的数据传递到MATLAB中继续进行下一步操作,期间的连接过程通过MATLAB支持的mex文件实现。根据需求,我依次进行了如下操作,所遇到的问题和解决思路都会在如下的阐述中分别进行描述:

第一步:在HDF的官网下载适用于自己电脑系统和VS版本的HDF库(我的是win10 64位+VS2013),安装后在系统的Program Files\HDF_Group\文件夹下会出现对应版本的HDF目录,并且HDF库目录被添加到系统环境变量中。
第二步:在VS或者MATLAB甚至是任何一款编辑软件中按照规范编写包含mexFunction入口函数的***.c或***.cpp文件(记得包含mex.h以及hdf.h、mfhdf.h等头文件)
第三步:在MATLAB中进入*.cpp文件的目录,运行以下命令进行编译:

mex ‘-IC:\Program Files\HDF_Group\HDF\4.2.13\include’ ‘-LC:\Program Files\HDF_Group\HDF\4.2.13\lib’ ***.cpp

此时提示报错:

error LNK2019: 无法解析的外部符号 SDstart,该符号在函数 “……” 中被引用

出现这种提示的原因往往是找不到指定的库文件,在VS工程的编译中我们常常使用在头部加入#pragma comment(lib,”***.lib”)语句的方式指定需要链接的lib,因此我们在***.cpp文件中也加入下面的几句命令:
#pragma comment(lib,”jpeg.lib”)
#pragma comment(lib,”szip.lib”)
#pragma comment(lib,”zlib.lib”)
#pragma comment(lib,”hdf.lib”)
#pragma comment(lib,”mfhdf.lib”)
然后继续执行编译命令:

mex ‘-IC:\Program Files\HDF_Group\HDF\4.2.13\include’ ‘-LC:\Program Files\HDF_Group\HDF\4.2.13\lib’ *.cpp

编译成功!
但是运行编译后的***.mexw64文件会提示:

Invalid MEX-file ‘D:\Ccode\Win32_hdftest\Win32_hdftest***.mexw64’: 找不到指定的程序。

针对这个问题,我在网上找了老半天,始终不能得到满意的解决,网友普遍认为出现该问题的原因还是程序找不到相关的HDF链接库。为了证实,我将cpp程序中所有处理hdf文件的命令注释掉,再执行编译和运行,果然没问题了!看来果然还是lib库的问题,可是,明明我已经将相关的库通过#pragma comment(lib,”***.lib”)命令提前声明了啊?就在这一点让我苦苦思考了很久……

后来我想,既然问题的原因在于没有找不到对应的链接库,也就是说明我上面的链接操作实际上并没有生效,那么能不能通过其它的途径来达到加入链接库的目的呢?当然是有的,MATLAB的mex命令可以通过-l具体指定需要用到的库文件,因此我重新执行了如下的编译命令:

mex ‘-IC:\Program Files\HDF_Group\HDF\4.2.13\include’ ‘-LC:\Program Files\HDF_Group\HDF\4.2.13\lib’ ‘-ljpeg.lib’ ‘-lszip.lib’ ‘-lzlib.lib’ ‘-lhdf.lib’ ‘-lmfhdf.lib’ *.cpp

结果仍旧报错,但是报错的原因不一样了:

libmfhdf.lib(array.obj) : error LNK2019: 无法解析的外部符号 xdr_long/xdr_u_long/xdr_enum/xdr_opaque/xdr_float/xdr_double,该符号在函数 xdr_NC_array 中被引用

看来这时候我们的编译过程已经打入hdf库内部,只是所依赖的附加库找不到而已。在’C:\Program Files\HDF_Group\HDF\4.2.13\lib’目录下我发现了还有一个xdr.lib库文件,估计和出错的原因有关,再将其加入进行编译:

mex ‘-IC:\Program Files\HDF_Group\HDF\4.2.13\include’ ‘-LC:\Program Files\HDF_Group\HDF\4.2.13\lib’ ‘-ljpeg.lib’ ‘-lszip.lib’ ‘-lzlib.lib’ ‘-lhdf.lib’ ‘-lmfhdf.lib’ ‘-lxdr.lib’ ***.cpp

依旧出错:

libmfhdf.lib(xdrposix.obj) : error LNK2019: 无法解析的外部符号 htonl/ntohl,该符号在函数 xdrposix_putlong 中被引用

这又是缺少哪个依赖库呢,百度之后发现还是一些接口缺少,在cpp文件中通过以下命令添加winsock接口:
#include “winsock2.h”
#pragma comment(lib,”ws2_32.lib”)

再执行编译命令:

mex ‘-IC:\Program Files\HDF_Group\HDF\4.2.13\include’ ‘-LC:\Program Files\HDF_Group\HDF\4.2.13\lib’ ‘-ljpeg.lib’ ‘-lszip.lib’ ‘-lzlib.lib’ ‘-lhdf.lib’ ‘-lmfhdf.lib’ ‘-lxdr.lib’ ***.cpp

成功!
运行该程序,正确输出!问题解决!!!
总结:我的问题从始至终其实就是lib库没有链接成功,但是中间进行添加#pragma comment(lib,”***.lib”)的操作后意外编译成功,蒙混过关让我误以为是出现了其他方面的问题,其实这个命令根本就没有从实质上解决问题,只是让编译看以来没问题而已。。所以缺少哪个库然后在mex命令后面用-l命令补全才能从根本上解决问题。

你可能感兴趣的:(计算机日常问题解决,c语言,matlab,mex,混合编程)