记一次手动安装perl模块的经历

perl是一个较为常见的脚本执行程序,但是由于我之前用得比较少,对其了解不多。

最近碰到了一个问题需要解决。是这样的,我想用C++写一个程序,实现百度开放API提供的翻译功能。在编译安装libcurl库以后,发现还有一个md5的函数需要openssl提供。由于我在网上找到的预编译的openssl库的lib文件有点问题,于是想着自己编译。

openssl提供的说明文档中指出,如果想用mingw编译,需要使用带有perl的msys2终端。我没有这个终端,于是用了git-bash代替。然而系统中安装的strawberry perl不能用(提示无法处理UNIX-Like的文件路径),而strawberry perl又与git-bash的perl冲突,因此手动修改了系统的环境变量$PATH,把strawberry perl的路径给删掉了。

这样以后,执行./Configure ming64依然不行,提示缺少几个perl的模块。于是有了本文的主题:手动安装perl模块。

要说一下,git-bash的perl很残废,连cpan运行都出错。因此,只能通过手动安装报错中提到的模块,一点一点解决问题。

例如下面这个报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ./Configure mingw64
Configuring OpenSSL version 3.0.2 for target mingw64
Using os-specific seed configuration
Creating configdata.pm
Running configdata.pm
Can't locate Pod/Escapes.pm in @INC (you may need to install the Pod::Escapes module) (@INC contains: /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl) at /usr/lib/perl5/vendor_perl/Pod/Simple.pm line 8.
BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/Pod/Simple.pm line 8.
Compilation failed in require at /usr/lib/perl5/vendor_perl/Pod/Simple/Methody.pm line 5.
BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/Pod/Simple/Methody.pm line 5.
Compilation failed in require at /usr/lib/perl5/vendor_perl/Pod/Text.pm line 6.
BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/Pod/Text.pm line 6.
Compilation failed in require at (eval 8) line 1.
BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/Pod/Usage.pm line 30.
Compilation failed in require at configdata.pm line 30297.
BEGIN failed--compilation aborted at configdata.pm line 30297.

提示缺少Pod::Escape模块,同时指出了几个perl的library路径。我们选择将模块安装到/usr/lib/perl5/vendor_perl路径下面。

在清华大学TUNA镜像站中找到CPAN,在这里寻找需要的模块。CPAN的所有模块列在了网页 https://mirrors.tuna.tsinghua.edu.cn/CPAN/modules/01modules.index.html 当中。由于页面太长,推荐在命令行中配合grep搜索指定模块的下载链接。

还是以上面这个模块为例,我们找到链接为

http://mirrors.tuna.tsinghua.edu.cn/CPAN/authors/id/N/NE/NEILB/Pod-Escapes-1.07.tar.gz

下载下来并解压,将压缩包里的lib下面的东西copy到/usr/lib/perl5/vendor_perl下面。

大部分缺失的perl模块可以通过这种方式得到安装。少部分模块可能直接搜索名字搜索不到,但是通过cpan install可以知道去下载哪个压缩包。

在编译libopenssl的过程中,perl主要用于configuration和复制一些文件,主要的编译工作依然是交给gcc完成。