使用wxFreeChart的备忘记录
最近,手头的工作遇到个问题,有个生成交流信号的程序,生成的数据输入设备中后出现异常现象。由于没有合适的测试手段来定位错误产生的源头,因此在生成交流数据的一端(记为Server端)进行了录波,将所生成的数据做了记录。为了直观方便的查看可能的问题,需要将录波数据用图形显示出来,并方便查看。
一开始使用matplotlib做了个简单的实现,几十行的代码即可显示,可给Canvas加入滚动条来滚动查看的功能一直没能实现,对matplotlib不熟悉以及对2D绘图的一些基本概念不是很清楚,实现滚动条这个功能特别费劲。 生成交流数据的主程序是基于c++的wxWidgets实现的,现在同事希望将录波数据显示在程序中,本来这个应用可以考虑将 python程序嵌入c++中的,可是现在用python的画图控件都没有弄好,只好考虑用c++原生的实现了。到wxcode看了下,正好最新的一个更新就是wxFreeChart 1.2,看了一下,正好可以适合我的要求,于是下载之。
解压后,使用vc7.1打开build子目录下的wxfreechart_vc7.sln进行编译,结果发现链接不能通过,原因是缺少wx的库wxmsw28d_gl.lib,回头又重编译wx的库,修改$(WXWIN)\include\wx\msw\setup.h文件中选项:
#define wxUSE_GLCANVAS 1
该问题解决后发现还是链接不通过,原来是freechart/include/wx/maker.h下的LineMarker和RangeMarker类的成员函数只有声明没有定义,我搜索了一下,发现这两个类没有在其它地方使用,于是把它们注释掉了。
之后,链接还是不过,继续看代码,发现是有些类没有定义,这时想起之前编译其他wxcode库时曾经出现的问题了,wxcode编译dll库时,为了复用头文件(在编译生成dll时要export符号,而include该头文件时要import符号),使用了编译开关来控制:
#ifdef WXMAKINGDLL_FREECHART
#define WXDLLIMPEXP_FREECHART WXEXPORT
#define WXDLLIMPEXP_DATA_FREECHART(type) WXEXPORT type
#elif defined(WXUSINGDLL) && !defined(_LOCAL_)
#define WXDLLIMPEXP_FREECHART WXIMPORT
#define WXDLLIMPEXP_DATA_FREECHART(type) WXIMPORT type
#else // not making nor using DLL
#define WXDLLIMPEXP_FREECHART
#define WXDLLIMPEXP_DATA_FREECHART(type) type
#endif
可我发现在今天发布的freechart 1.2版本里忘记了加入下面两行:
#define WXDLLEXPORT WXDLLIMPEXP_FREECHART
#define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_FREECHART
如果没有这2行,WXDLLEXPORT和WXDLLEXPORT_DATA宏都不会取我们需要的内容;增加这两行后,生成dll的编译链接成功,可以看到dll和lib都编译好了。
接着编译wxFreeChartDemo_dll项目,还是发现编译问题,原来是CategorySimpleDataset类型没有定义,查看源代码,发现CategorySimpleDataset根本没有在dll中导出,原来是freechart/include/wx/category/categorysimpledataset.h里的代码如下:
class CategorySimpleDataset : public CategoryDataset
改为:
class WXDLLIMPEXP_FREECHART CategorySimpleDataset : public CategoryDataset
重新编译dll和demo成功。
已经不是第一次遇到wxcode中的代码有这样的问题了,真不知道库作者发布前有没有做过简单测试,每次都要改代码才能使用,不过比起自己来实现还是省时多了,总之要谢谢wx和wxcode各开发人员的贡献,希望wx越来越好用!
最新评论