**************************************************************
Qt 出现“undefined reference to `vtable for”原因总结
-----------------------------------------------------------------
出错原因是在定义类的时候为了能使用signals和slot,在类定义的后面加了Q_OBJECT引起。 因为Q_OBJECT是一个宏,在不同的类中展开是不同的代码。
错误正是因为Makefile里没有将moc_XXX.cpp加入编译引起。
Makefile背后的原因是qmake,因为Qt的编译系统是通过qmake将.pro 文件转换成Makefile文件。当qmake扫描.h代码时发现有Q_OBJECT这样字眼的代码时,会将一个用moc生成moc_xxx.cpp代码 的依赖关系写到Makefile里。如果扫描时没有找到Q_OBJECT就不会生成额外的moc_xxx.cpp这样的文件。
出现最初一幕的原因是在执行qmake的时候.h代码里并没有O_OBJECT这样的代码。而执行make的时候.h里已经有Q_OBJECT了,解决的方法就是重新执行qmake,然后执行make.
高涛实际解决办法:
清理项目;
删除掉makefile文件。
**************************************************************
使用ftp的问题
-----------------------------------------------------------------
从服务器下载升级文件时,要求使用进度条功能,正好ftp提供了相应功能,对应的函数为S_egetProgressVal。
测试了下,大概可以用,该函数会不断地被ftp功能调用,并且会传回进度值。
但是,仔细测试后,发现:在下载完成后S_egetProgressVal才会被调用。
经检查,原因为,我在使用ftp_get后,通过一个while循环来判断是否下载完成了(通过变量g_iFTPSendLogFileResult),
而这样做阻塞了该线程,导致S_egetProgressVal不能被及时调用。
修改为:执行ftp_get后,如果下载完成,在FtprevalueReport函数中可以得到结果,这是以异步的方式得到结果的,因此不会阻塞。
结论:ftp_get后最好不要由其他内容
**************************************************************
使用shell执行命令的问题
-----------------------------------------------------------------
想执行的命令为:
ll
错误提示为未找到命令。
原因:
ll是ls -l 的 别名,似乎不能用别名。