【引子】
在suse linux系统下部署好filezilla client源代码编译环境,filezilla版本为filezilla-3.7.1,但是编译的时候报错。
【错误】
g++ -DHAVE_CONFIG_H -I. -I../../../src/engine -I../../src/include -I../../../src/engine/../include -I/usr/local/include -I/usr/local/lib/wx/include/gtk2-ansi-release-2.8 -I/usr/local/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXGTK__ -fpch-preprocess -g -O2 -Wall -g -fexceptions -std=gnu++0x -MT libengine_a-serverpath.o -MD -MP -MF .deps/libengine_a-serverpath.Tpo -c -o libengine_a-serverpath.o `test -f 'serverpath.cpp' || echo '../../../src/engine/'`serverpath.cpp
../../../src/engine/serverpath.cpp: In member function ‘wxString CServerPath::GetSafePath() const’:
../../../src/engine/serverpath.cpp:289: error: cannot convert ‘wxChar*’ to ‘wchar_t*’ for argument ‘1’ to ‘wchar_t* wcscpy(wchar_t*, const wchar_t*)’
../../../src/engine/serverpath.cpp:298: error: cannot convert ‘wxChar*’ to ‘wchar_t*’ for argument ‘1’ to ‘wchar_t* wcscpy(wchar_t*, const wchar_t*)’
【分析】
上面的错误信息表明文件serverpath.cpp中函数wcscpy()的第一个传递参数跟形参类型不一样。
一个是 ‘wxChar*’,一个是‘wchar_t*’。
通过查看代码serverpath.cpp,发现函数wcscpy替换了宏tstrcpy。
宏tstrcpy的定义在serverpath.cpp文件的第258到262行。如下代码片段所示:
#ifdef wxUSE_UNICODE
#define tstrcpy wcscpy
#else
#define tstrcpy strcpy
#endif
上面代码说明了编译filezilla需要用Unicode构建的wxWidgets。
从上面错误信息中看到-I/usr/local/lib/wx/include/gtk2-ansi-release-2.8,得知原先安装的wxWidgets是ansi构建的wxWidgets。
原先安装wxWidgets方式:
>../configure --with-gtk
>vim config.log
-----------------------------------------------------------------------
4021 wx_cv_use_treebook=wxUSE_TREEBOOK=yes
4022 wx_cv_use_treectrl=wxUSE_TREECTRL=yes
4023 wx_cv_use_unicode=wxUSE_UNICODE=no
4024 wx_cv_use_universal=wxUSE_UNIVERSAL=no
4025 wx_cv_use_universal_binary=wxUSE_UNIVERSAL_BINARY=no
-----------------------------------------------------------------------
看到默认安装wxWidgets时不是Unicode构建。
【解决方案】
1、卸载原先的wxWidgets.
>make uninstall
2、用Unicode的方式安装wxWidgets.
> ../configure --with-gtk --enable-unicode --enable-printfposparam
>vim config.log
-----------------------------------------------------------------------
4593 wx_cv_use_treebook=wxUSE_TREEBOOK=yes
4594 wx_cv_use_treectrl=wxUSE_TREECTRL=yes
4595 wx_cv_use_unicode=wxUSE_UNICODE=yes
4596 wx_cv_use_universal=wxUSE_UNIVERSAL=no
4597 wx_cv_use_universal_binary=wxUSE_UNIVERSAL_BINARY=no
-----------------------------------------------------------------------
>make
>make install
3、重新安装filezilla
安装成功。
4、运行filezilla