感悟matlab下mex XXX.cpp 文件

以前mex .c文件,这次mex .cpp文件,感觉不一样。针对后者而言,更容易出现问题.

1.头文件的使用,不能随意加头文件,除非必要,因为容易出现嵌套问题。比如头文件定义了的变量,在内容中继续定义,就出现重复使用问题,遇到了只能根据提示手动修改;

2.这次调试,主要是一个gettimeofday函数问题,这个是linux下定义的,windows下没有。百度之后,发现这个定义在win下好用,需要win自带#include<time.h>,否则函数定义下的tm不能被识别;

 int  gettimeofday(struct timeval*tv, struct timezone *tz)

{
    time_t clock;
    struct tm tm;
    SYSTEMTIME wtm;

    GetLocalTime(&wtm);
    tm.tm_year     = wtm.wYear - 1900;
    tm.tm_mon     = wtm.wMonth - 1;
    tm.tm_mday     = wtm.wDay;
    tm.tm_hour     = wtm.wHour;
    tm.tm_min     = wtm.wMinute;
    tm.tm_sec     = wtm.wSecond;
    tm. tm_isdst    = -1;
    clock = mktime(&tm);
    tv->tv_sec = clock;
    tv->tv_usec = wtm.wMilliseconds * 1000;

    return (0);
}

3.在调试过程中还容易出现 这种链接 "   RP_mex.mexw64 : fatal error LNK1120: 6 个无法解析的外部命令  "问题 ,执行了相应的头文件,但是却没有执行对应的CPP文件。
在matlab下执行mex(fullfile('..', 'src', 'RP_mex.cpp'),  fullfile('..', 'src', 'stopwatch', 'Stopwatch.cpp'))语句,将文件一起run。这可能和VS2008下的同一个工程有异曲同工之妙,自己没有试过。
>> mex RP_mex.cpp
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.
 
C:\Users\user\AppData\Local\Temp\mex_eckPUm\RP_mex.obj  
   正在创建库 C:\Users\user\AppData\Local\Temp\mex_eckPUm\templib.x 和对象 C:\Users\user\AppData\Local\Temp\mex_eckPUm\templib.exp
RP_mex.obj : error LNK2019: 无法解析的外部符号 "public: __cdecl Stopwatch::~Stopwatch(void)" (??1Stopwatch@@QEAA@XZ),该符号在函数 "class std::vector<class BBox,class std::allocator<class BBox> > __cdecl RP(class Image const &,class Params const &)" (?RP@@YA?AV?$vector@VBBox@@V?$allocator@VBBox@@@std@@@std@@AEBVImage@@AEBVParams@@@Z) 中被引用
......
   D:\PROGRA~2\MATLAB\R2008A\BIN\MEX.PL: Error: Link of 'RP_mex.mexw64' failed.


总结,(1)这次调试费时1.5day,三个问题,先出现3,然后是1,再是2,然后又是1,就是不断反复出现,都搞了1天半,基本都蛮熟悉,所以过程是很重要的;

(2)在调试过程中,每当出现问题时,总是怀疑什么时候才是尽头,对于没有书写超过1000行代码的菜鸟,确实在程序语言调试上不自信,但是调试和书写不一样,调试总有提示,自己也能做出判断(这里很有趣的一点是,个人做判断的时候,感觉有第6感,这种感觉可能也来源于积累),不断调试总会成功!

(3)自信,自信,自信!

相关文章
相关标签/搜索