本来在Windows上面我是不需要这样的软件的,一方面我收到的加密邮件并不多,另一方面我已经习惯了用纯命令的方式进行加解密了。来编译这个Gpg4Win 这个页面上我目前最新下载的是gpg4win-2.2.2.exe,但是他们似乎没有严格测试过软件。我从2.2.1升级到2.2.2后,那个GPA密钥管理助手就不能启动,说是缺少libwinpthread-1.dll。更正下,是找不到rand_s,在msvcrt.dll中。
虽然官方使用的是Debian7,我也有装好的Debian系统。不过我选择的我最喜爱的Archlinux来编译的,好处是所有软件足够新,比Ubuntu更加激进,但是又不是Debian系列开发版那种会使人心理不安的那种。其次我在Ubuntu上测试编译了一下,果真不行,Ubuntu上面编译latex的地方就会出错直接终止进程,而我看了下texinfo版本(apt-cache -s texinfo
)也是5.2版本的。所以可以肯定,Ubuntu要正常编译出来,要解决的问题一定比Archlinux多得多。(粗略感觉下,我对编译Compendium.pdf这个地方,Latex出错就无能为力了。而且我是完全按照官网 指令安装了全部依赖了的。
总之,虽然我物理机装的是Ubuntu,但是对于一些GNU的cpp开发,Ubuntu应该不是一个好的选择。
1.环境介绍
而Archlinux却有好几个包根本找不到任何对应的包,比如latex-xcolor这个,我完全不知道对应什么。不过还好Archlinux有yaourt可以方便安装非官方的包,比如docbook-utils,mingw-w64-**依赖库等。
我的Arch的mingw-w64-gcc是4.9.1-3的,这应该是最前沿的了吧,所有依赖库是非官方维护,通过源码本地编译出来的,所以mingw不会出现找不到符号的错误。这个非常关键。
总之我不知道官方的版本在Debian是否真的如官网编译wiki 上面说的那么轻松三条命令搞定
官网编译命令MyBlog
cd gpg4win/packages && ./download.sh && cd ..
./autogen.sh --force
./autogen.sh --build-w32 && make
我没有在Debian上面测试,这看上去把所有的细节都封装到了autogen脚本里面去了。刚刚出错的时候我还不知怎么回事,不过进到目录里面就清楚了。
下面我列出官网顺序执行下的错误列表
2.错误列表:
下面的错误列表我按出现的时间顺序给出。
错误1
libadns-1.dll.def:2: syntax error
具体错误信息如下
libadns-1.dll.def:2: syntax error错误信息MyBlog
/usr/lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/bin/ld:.libs/libadns-1.dll.def:2: syntax error
collect2: error: ld returned 1 exit status
Makefile:390: recipe for target 'libadns.la' failed
make[ 6] : *** [ libadns.la] Error 1
make[ 6] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/adns-1.4-g10-4-build/src'
Makefile:308: recipe for target 'all' failed
make[ 5] : *** [ all] Error 2
make[ 5] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/adns-1.4-g10-4-build/src'
Makefile:284: recipe for target 'all-recursive' failed
make[ 4] : *** [ all-recursive] Error 1
make[ 4] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/adns-1.4-g10-4-build'
gpg4win.mk:476: recipe for target 'stamps/stamp-adns-03-make' failed
make[ 3] : *** [ stamps/stamp-adns-03-make] Error 2
make[ 3] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:963: recipe for target 'all-recursive' failed
make[ 2] : *** [ all-recursive] Error 1
make[ 2] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:722: recipe for target 'all-recursive' failed
make[ 1] : *** [ all-recursive] Error 1
make[ 1] : Leaving directory '/home/rexdf/prog/gpg4win'
Makefile:660: recipe for target 'all' failed
make: *** [ all] Error 2
解决办法:
网上搜索找到了两个
一个邮件 里面的patch可以参考,需要手工打patch,因为行号似乎和现在版本对不上。
还是一个邮件 ,是Fedora上的,不过没有后续提出的解决办法。
我的解决办法,①我尝试过降级libtool,但是libtool是binutils的一部分,降级binutils需要降级gcc,这个就非常麻烦了。简单点说就是不可能的了。
Debian是libtool2.2,好像从libtool2.3就开始不支持def导出符号表中有双行EXPORTS
,这个在上面第一个邮件里面争论过,最终是大家都说是upstream的问题或者libtool的错误,反正本该这样支持双EXPORTS
等,反正现在是悬着的问题,自然就是留给了我们编译用户了。
②降级binutils不行,自然就是改代码了。准确地说是hacking代码,反正只要欺骗libtool这是一个合格的def导出符号表就行了。对于这个编译过程中工具链的调用方式的真的是没有搞懂的,反正传统的./configure && make
是绝对不会编译出正确的结果的,因为是cross-build,自然是要传CXX或者host,target等参数进去的。不过最终我也没有搞懂这些参数是怎么传递进去的,不过问题还是被我给解决了。hacking code
修改的文件MyBlog
vim /home/rexdf/prog/gpg4win/src/playground/build/adns-1.4-g10-4-build/libtool
查找EXPORTS,一直找到echo EXPORTS
的一行,我的是325行。
要修改的行MyBlog
echo EXPORTS > \$ output_objdir/\$ soname.def;
cat \$ export_symbols >> \$ output_objdir/\$ soname.def;
把这两行的第一行删除,第二行的>>
改成>
,已覆盖而不是追加。
保存退出,继续执行make
。vim界面如下如:
错误2
libw32pth-0.dll.def:2: syntax error
具体错误信息如下
libw32pth-0.dll.def:2: syntax error错误信息MyBlog
/usr/lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/bin/ld:.libs/libw32pth-0.dll.def: file format not recognized; treating as linker script
/usr/lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/bin/ld:.libs/libw32pth-0.dll.def:2: syntax error
collect2: error: ld returned 1 exit status
Makefile:421: recipe for target 'libw32pth.la' failed
make[ 5] : *** [ libw32pth.la] Error 1
make[ 5] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/w32pth-2.0.5-build'
Makefile:331: recipe for target 'all' failed
make[ 4] : *** [ all] Error 2
make[ 4] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/w32pth-2.0.5-build'
gpg4win.mk:476: recipe for target 'stamps/stamp-w32pth-03-make' failed
make[ 3] : *** [ stamps/stamp-w32pth-03-make] Error 2
make[ 3] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:963: recipe for target 'all-recursive' failed
make[ 2] : *** [ all-recursive] Error 1
make[ 2] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:722: recipe for target 'all-recursive' failed
make[ 1] : *** [ all-recursive] Error 1
make[ 1] : Leaving directory '/home/rexdf/prog/gpg4win'
Makefile:660: recipe for target 'all' failed
make: *** [ all] Error 2
解决办法同 错误1 只要按照上面的修改/home/rexdf/prog/gpg4win/src/playground/build/w32pth-2.0.5-build/libtool
即可。然后再次执行make.
错误3
libksba-8.dll.def:2: syntax error
解决办法同 错误1 只要按照上面的修改/home/rexdf/prog/gpg4win/src/playground/build/libksba-1.3.0-build/libtool
即可。然后再次执行make.
错误4
libscute-0.dll.def:2: syntax error
解决办法同 错误1 只要按照上面的修改/home/rexdf/prog/gpg4win/src/playground/build/scute-1.4.0-build/libtool
即可。然后再次执行make.
错误5
具体错误信息如下:
gnutls的doc编译错误MyBlog
../../gnutls-2.12.23/doc/gnutls.texi:119: warning: node prev ` Function and Data Index' in menu `Concept Index' and in sectioning ` Bibliography' differ
../../gnutls-2.12.23/doc/gnutls.texi:124: warning: node `Function and Data Index' is next for ` Concept Index' in menu but not in sectioning
../../gnutls-2.12.23/doc/gnutls.texi:124: warning: node prev `Concept Index' in menu ` Copying Information' and in sectioning `Function and Data Index' differ
Makefile:1377: recipe for target '../../gnutls-2.12.23/doc/gnutls.info' failed
make[ 8] : *** [ ../../gnutls-2.12.23/doc/gnutls.info] Error 1
make[ 8] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gnutls-2.12.23-build/doc'
Makefile:1568: recipe for target 'all-recursive' failed
make[ 7] : *** [ all-recursive] Error 1
make[ 7] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gnutls-2.12.23-build/doc'
Makefile:1290: recipe for target 'all' failed
make[ 6] : *** [ all] Error 2
make[ 6] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gnutls-2.12.23-build/doc'
Makefile:1222: recipe for target 'all-recursive' failed
make[ 5] : *** [ all-recursive] Error 1
make[ 5] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gnutls-2.12.23-build'
Makefile:1151: recipe for target 'all' failed
make[ 4] : *** [ all] Error 2
make[ 4] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gnutls-2.12.23-build'
gpg4win.mk:476: recipe for target 'stamps/stamp-gnutls-03-make' failed
make[ 3] : *** [ stamps/stamp-gnutls-03-make] Error 2
make[ 3] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:963: recipe for target 'all-recursive' failed
make[ 2] : *** [ all-recursive] Error 1
make[ 2] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:722: recipe for target 'all-recursive' failed
make[ 1] : *** [ all-recursive] Error 1
make[ 1] : Leaving directory '/home/rexdf/prog/gpg4win'
Makefile:660: recipe for target 'all' failed
make: *** [ all] Error 2
这个错误和前面的错误不同了,这个是兼容问题了gnutls的texi兼容texinfo的4.x版本,而Archlinx版本是5.2-2(甚至Ubuntu都是5.2)。
不过幸运的是Archlinux降级比较方便,而且texinfo似乎没有被任何包依赖。执行如下命令降级。 从这个页面 选择一个mirror下载。
降级texinfo命令MyBlog
wget ftp://debian.linux.org.tw/pub/CLE/pub/ArchLinux/current/os/x86_64/texinfo-4.13a-4-x86_64.pkg.tar.xz
sudo pacman -U texinfo-4.13a-4-x86_64.pkg.tar.xz
提示信息如下
降级texinfo提示信息MyBlog
正在加载软件包...
警告:正在降级软件包 texinfo ( 5.2-2 = > 4.13a-4)
正在解决依赖关系...
正在查找相互冲突...
软件包 ( 1) : texinfo-4.13a-4
全部安装大小: 2.34 MiB
净更新大小: -5.47 MiB
:: 进行安装吗? [ Y/n] y
( 1/1) 正在检查密钥环里的密钥 [ ##############################################] 100%
( 1/1) 正在检查软件包完整性 [ ##############################################] 100%
( 1/1) 正在加载软件包文件 [ ##############################################] 100%
( 1/1) 正在检查文件冲突 [ ##############################################] 100%
( 1/1) 正在检查可用硬盘空间 [ ##############################################] 100%
( 1/1) 降级中 texinfo
然后再次执行make.
错误6
无法获取”gtk-tut” 的文件状态(stat): 没有那个文件或目录
提示信息如下
gtk-2.24编译错误信息MyBlog
window) ;
gtk_widget_show ( button) ;
gtk_widget_show ( window) ;
gtk_main () ;
return 0;
} Done.
mv: 无法获取"gtk-tut" 的文件状态( stat) : 没有那个文件或目录
mkdir: 无法创建目录"html/images" : 没有那个文件或目录
cp: 目标"html/images" 不是目录
Makefile:645: recipe for target 'html' failed
make[ 7] : *** [ html] Error 1
make[ 7] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gtk+-2.24.24-build/docs/tutorial'
Makefile:493: recipe for target 'all-recursive' failed
make[ 6] : *** [ all-recursive] Error 1
make[ 6] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gtk+-2.24.24-build/docs'
Makefile:719: recipe for target 'all-recursive' failed
make[ 5] : *** [ all-recursive] Error 1
make[ 5] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gtk+-2.24.24-build'
Makefile:610: recipe for target 'all' failed
make[ 4] : *** [ all] Error 2
make[ 4] : Leaving directory '/home/rexdf/prog/gpg4win/src/playground/build/gtk+-2.24.24-build'
gpg4win.mk:476: recipe for target 'stamps/stamp-gtk+-03-make' failed
make[ 3] : *** [ stamps/stamp-gtk+-03-make] Error 2
make[ 3] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:963: recipe for target 'all-recursive' failed
make[ 2] : *** [ all-recursive] Error 1
make[ 2] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:722: recipe for target 'all-recursive' failed
make[ 1] : *** [ all-recursive] Error 1
make[ 1] : Leaving directory '/home/rexdf/prog/gpg4win'
Makefile:660: recipe for target 'all' failed
make: *** [ all] Error 2
这个是在编译gtk2.24的html版本doc的时候出错了。
在这封邮件 里面提到了同样的问题。
因为我们是在编译gpg4win,而不是gtk,所以doc完全可以忽略的。因此我采用了比较粗暴的hacking。
修改gtk的doc问题MyBlog
vim /home/rexdf/prog/gpg4win/src/playground/build/gtk+-2.24.24-build/docs/Makefile
查找tutorial,找到SUBDIRS = tutorial faq reference tools
一行,直接删除tutorial和faq两项。我的在444行。
结果如下图
然后再次执行make.
错误7
找不到libgcc_s_sjlj-1.dll-x和libstdc++-6.dll-x
具体错误信息如下
找不到libstdc++-6.dll-xMyBlog
- g4wihelp::stopsound
File: "/home/rexdf/prog/gpg4win/src/libstdc++-6.dll-x" -> no files found.
Usage: File [ /nonfatal] [ /a] ([ /r] [ /x filespec [ ...]] filespec [ ...] |
/oname= outfile one_file_only)
!include: error in script: "inst-gpg4win.nsi" on line 93
!include: error in script: "inst-sections.nsi" on line 22
Error in script "./gpg4win.nsi" on line 223 -- aborting creation process
Makefile:1461: recipe for target 'gpg4win-2.2.2-beta3.exe' failed
make[ 3] : *** [ gpg4win-2.2.2-beta3.exe] Error 1
make[ 3] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:963: recipe for target 'all-recursive' failed
make[ 2] : *** [ all-recursive] Error 1
make[ 2] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:722: recipe for target 'all-recursive' failed
make[ 1] : *** [ all-recursive] Error 1
make[ 1] : Leaving directory '/home/rexdf/prog/gpg4win'
Makefile:660: recipe for target 'all' failed
make: *** [ all] Error 2
解决命令
拷贝两个缺失的dll-xMyBlog
cp /usr/i686-w64-mingw32/bin/libgcc_s_sjlj-1.dll src/libgcc_s_sjlj-1.dll-x
cp /usr/i686-w64-mingw32/bin/libstdc++-6.dll src/libstdc++-6.dll-x
错误8
找不到pinentry-w32.exe和pinentry-qt4.exe
具体错误信息如下
找不到pinentry-w32.exeMyBlog
- g4wihelp::stopsound
File: "playground/install/pkgs/pinentry-0.8.4-beta8/bin/pinentry-w32.exe" -> no files found.
Usage: File [ /nonfatal] [ /a] ([ /r] [ /x filespec [ ...]] filespec [ ...] |
/oname= outfile one_file_only)
!include: error in script: "inst-pinentry.nsi" on line 38
!include: error in script: "inst-sections.nsi" on line 141
Error in script "./gpg4win.nsi" on line 223 -- aborting creation process
Makefile:1461: recipe for target 'gpg4win-2.2.2-beta3.exe' failed
make[ 3] : *** [ gpg4win-2.2.2-beta3.exe] Error 1
make[ 3] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:963: recipe for target 'all-recursive' failed
make[ 2] : *** [ all-recursive] Error 1
make[ 2] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:722: recipe for target 'all-recursive' failed
make[ 1] : *** [ all-recursive] Error 1
make[ 1] : Leaving directory '/home/rexdf/prog/gpg4win'
Makefile:660: recipe for target 'all' failed
make: *** [ all] Error 2
解决命令
拷贝两个缺失的pinentry-*.exeMyBlog
cp src/playground/build/pinentry-0.8.4-beta8-build/w32/pinentry-w32.exe src/playground/install/pkgs/pinentry-0.8.4-beta8/bin/pinentry-w32.exe
cp src/playground/build/pinentry-0.8.4-beta8-build/qt4/pinentry-qt4.exe src/playground/install/pkgs/pinentry-0.8.4-beta8/bin/pinentry-qt4.exe
然后执行make.
错误9
具体错误信息如下
找不到gpgex.dllMyBlog
File: "playground/install-ex/pkgs/gpgex-1.0.1/bin/gpgex.dll" -> no files found.
Usage: File [ /nonfatal] [ /a] ([ /r] [ /x filespec [ ...]] filespec [ ...] |
/oname= outfile one_file_only)
!include: error in script: "inst-gpgex.nsi" on line 87
!include: error in script: "inst-sections.nsi" on line 162
Error in script "./gpg4win.nsi" on line 223 -- aborting creation process
Makefile:1461: recipe for target 'gpg4win-2.2.2-beta3.exe' failed
make[ 3] : *** [ gpg4win-2.2.2-beta3.exe] Error 1
make[ 3] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:963: recipe for target 'all-recursive' failed
make[ 2] : *** [ all-recursive] Error 1
make[ 2] : Leaving directory '/home/rexdf/prog/gpg4win/src'
Makefile:722: recipe for target 'all-recursive' failed
make[ 1] : *** [ all-recursive] Error 1
make[ 1] : Leaving directory '/home/rexdf/prog/gpg4win'
Makefile:660: recipe for target 'all' failed
make: *** [ all] Error 2
解决般办法
拷贝gpgex.dllMyBlog
mkdir -p src/playground/install-ex/pkgs/gpgex-1.0.1/bin/
cp src/playground/build/gpgex-1.0.1-build/src/gpgex.dll src/playground/install-ex/pkgs/gpgex-1.0.1/bin/gpgex.dll
然后执行make. 结果如下如。
补充错误
对于configure阶段的error我都是没有列出来的因为不记得了。大体的解决思路是缺少什么首先pacman -S
然后yaourt -S
,如果找不到则到网上搜索对应于Archlinux的包名称。因为Redhat系列、Debian系列与Archlinux系列一些包,特别是dev和header后缀的一些包,在Archlinux中都是不存在的,只要安装对应的主包即可。
收尾工作
在Archlinux中执行sudo pacman -Syu
把texinfo升级回去。缺少libwinpthread-1.dll在/usr/i686-w64-mingw32/bin/下面,scp复制出来,放到Gpg4win的Windows安装目录就好了,注意时机,越早越好,否则会有一些组件注册失败。
结果
不知道怎么回事虽然configure的时候是选的w32,但是Claws-Mail还是被编译成64位的了,在32位XP下面无法打开Claws-Mail。