星期日, 二月 22, 2009

09年2月编程语言排行榜


大家都认识多少?




星期六, 二月 21, 2009

Qtiplot 0.9.7.4在Windows下的编译

Qtiplot发布了新版本0.9.7.4,变动不小,编译过程也相应的需要发生一些变化。


首先是第三方库的编译:


qwtplot3d已经整合到主程序的编译过程中去了,所以不需要单独编译了,只需要保留官方包里面默认的即可;


gsl,muparser,qwt,zlib还是和先前版本一样,参见前帖《编译Win版本Qtiplot》。其中,gsl直接使用msys编译安装,安装到3rdparty下的gsl目录;muparser使用build目录下自带的makefile.mingw来编译;qwt使用Qt工具直接qmake make编译成静态库;zlib就直接下载zlib123-dll.zip放到zlib123去就可以了。


新使用的boost,首先下载boost_1_38_0.tar.bz2,解压缩出来,然后下载boost-jam-3.1.17-1-ntx86.zip,将其中的工具bjam.exe放到boost的根目录下,然后在命令行中(环境变量中要有mingw的bin目录)使用命令"bjam "toolset=gcc" install",经过漫长的等待就可以在C:\boost目录下看到编译好的boost了,拷到3rdparty备用。


还有就是libpng的编译,这个库本身有配置好的make文件scripts\makefile.mingw,但是需要zlib的支持,所以还需要跟libpng一级的目录下放上zlib的源代码zlib-1.2.3.tar.gz,目录即为zlib,zlib还要预先在msys下用./configure make编译好。


编译好第三方库之后,再修改qtiplot.pro,准备编译主程序。主要的一个就是3rd PARTY HEADER FILES SECTION里面的路径和3rd PARTY LIBRARIES SECTION下的win32:XXX的路径,根据实际情况进行修改。还有一个是# Comment the next line, if you dont have libpng on your windows system段下面的libpng路径的修改,如果按照官方做法来,几乎不需要调整,我这里只有boost的headers需要改变。目录结构参见文章结尾。


另一个重要的修改就是python的屏蔽,因为python的支持需要特定的版本的python pyqt sip的支持,所以一般都不使用。首先是要把qtiplot.pro里面的第三行# SCRIPTING_LANGS += Python屏蔽好,但是新版本中仅仅这样还不够,还会在连接的时候出现ScriptEdit.cpp中对PythonSyntaxHighlighter的undefined reference。我折腾了几个礼拜,终于在网上找到了qtiplot的patch——qtiplot-0.9.7.4-no-python.patch,原来是要修改一下这个文件。把qtiplot-0.9.7.4\qtiplot\src\scripting\ScriptEdit.cpp单独拿出来跟qtiplot-0.9.7.4-no-python.patch放在一起,然后在msys下使用命令patch –i qtiplot-0.9.7.4-no-python.patch,再把修改好的ScriptEdit.cpp放回去,这样就可以真正屏蔽python了。


经过这样的准备工作之后,就是qmake make了,然后就可以得到编译好的主程序。如果需要多语言支持,可以在qmake之前把qtiplot.pro中的
#system(lupdate -verbose qtiplot.pro)
#system(lrelease -verbose qtiplot.pro)
两句话解除屏蔽,就可以得到语言文件。


目录:


qtiplot-0.9.7.4
—3rdparty
——boost
——gsl
——liborigin
——libpng
——muparser
——qwt
——qwtplot3d
——zlib(libpng用的)
——zlib123

Qt4.43与MinGW5.14的使用问题

        使用最新版本的Qt和MinGW编译,会出现错误,Qt 目录下的 "\src\corelib\arch\qatomic_windows.h" 与 MinGW 目录下的 "\include\winbase.h" 中有部分函数发生了原型冲突(prototype conflict;也就是相同的函数被重复定义了两次。这是在w32api-3.12之后版本就与Qt产生的冲突,解决方案如下:
打开Qt目录下的qatomic_windows.h,找到
extern "C" {
    __declspec(dllimport) long __stdcall InterlockedCompareExchange(long *, long, long);
    __declspec(dllimport) long __stdcall InterlockedIncrement(long *);
    __declspec(dllimport) long __stdcall InterlockedDecrement(long *);
    __declspec(dllimport) long __stdcall InterlockedExchange(long *, long);
    __declspec(dllimport) long __stdcall InterlockedExchangeAdd(long *, long);
}
替换成
#ifndef __INTERLOCKED_DECLARED
#define __INTERLOCKED_DECLARED
extern "C" {
    __declspec(dllimport) long __stdcall InterlockedCompareExchange(long *, long, long);
    __declspec(dllimport) long __stdcall InterlockedIncrement(long *);
    __declspec(dllimport) long __stdcall InterlockedDecrement(long *);
    __declspec(dllimport) long __stdcall InterlockedExchange(long *, long);
    __declspec(dllimport) long __stdcall InterlockedExchangeAdd(long *, long);
}
#endif
这样修改过后就不会再有问题了。