作者:大廷705 | 来源:互联网 | 2023-08-28 15:18
以前mex.c文件,这次mex.cpp文件,感觉不一样。针对后者而言,更容易出现问题.1.头文件的使用,不能随意加头文件,除非必要,因为容易出现嵌套问题。比如头文件定义了的变量,在内容中
以前mex .c文件,这次mex .cpp文件,感觉不一样。针对后者而言,更容易出现问题.
1.头文件的使用,不能随意加头文件,除非必要,因为容易出现嵌套问题。比如头文件定义了的变量,在内容中继续定义,就出现重复使用问题,遇到了只能根据提示手动修改;
2.这次调试,主要是一个gettimeofday函数问题,这个是linux下定义的,windows下没有。百度之后,发现这个定义在win下好用,需要win自带#include,否则函数定义下的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 > __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)自信,自信,自信!