在Windows下编译less.exe
如何将Linux系统下的文本查看器less
编译到Windows上?
一、背景
GNU less 是一个很好用的命令行文本查看器,在Linux系统上默认安装,其提供了包括文件查看、字符串搜索在内的许多功能,并且在打开大文件(例如1GB大小的基因组数据)时速度极快。
由于工作环境限制,笔者需要经常在Windows系统的电脑下查看文本文件。windows系统自带了记事本、写字板等文本查看器,但是如上所述,打开大文件时这些软件的速度很慢。此外,笔者也安装了vscode、 GVIM 、busybox 等软件,但是这些软件也不尽然能够满足笔者的需求(例如,vscode本质上是个浏览器,因此速度更慢;GVIM提供了和Linux vim一致的使用体验,但是在打开大文件时依然很慢;busybox自带了一个精简版的less,勉强可用,但诸多细节依然不及完整版less)。因此,笔者萌生了编译windows版less的想法。
二、材料
1、编译器安装
编译less需要C++编译器和perl解释器。本文将以MinGW-w64 为例介绍C++编译器的安装,以Strawberry Perl 为例介绍perl解释器的安装。读者也可以选择其他编译器和解释器,但大致思路是相同的。
(1)MinGW-64
MinGW-w64 是一个大型项目,旨在将GNU Linux上的GCC编译器移植到Windows等系统上。熟悉Linux GCC编译器的同学应该很容易上手MinGW-64的编译器,二者在许多地方是相似的。
下载地址:
根据Windows系统的对应架构选择合适的编译器版本并下载整合包,例如笔者所下载的就是 x86_64-12.2.0-release-win32-seh-msvcrt-rt_v10-rev2.7z
这个文件。下载后将其解压到D盘根目录(“解压文件到目标路径”; 读者也可以选择其他位置,但环境变量相应的需要改动 ),然后编辑系统环境变量(此电脑→属性→高级系统设置→环境变量),在 Path
这个变量中新建一条记录 D:\mingw64\bin
。修改环境变量的目的是方便后续在命令行中访问MinGW编译器,其应该与MinGW的安装路径一致。
现在打开Windows命令提示符(也可以用Windows Powershell),输入下列指令:
1 | gcc --version |
如果看到以下输出
1 | gcc (x86_64-win32-seh-rev2, Built by MinGW-W64 project) 12.2.0 |
则说明安装成功。
如果提示“gcc不是内部或外部命令,也不是可运行的程序或批处理文件”,则检查环境变量是否设置正确,或者环境变量是否与MinGW的安装路径一致。
(2)Strawberry Perl
Strawberry Perl 是Perl解释器在Windows系统上的实现。其安装方法很简单。只需要点击 官网链接 ,下载安装包,然后运行安装包,其会自动完成安装的过程,并配置好环境变量。
安装完成后,重启Windows命令提示符,输入下列指令:
1 | perl -v |
如果看到类似下面的输出
1 | This is perl 5, version 32, subversion 1 (v5.32.1) built for MSWin32-x64-multi-thread |
则说明安装成功
2、less程序源代码
见 GNU less的官网 。网站上列出了一个FTP服务器(http://ftp.gnu.org/gnu/less/ ),点击访问,并下载最新版源代码压缩包。笔者所下载的版本是version 608(http://ftp.gnu.org/gnu/less/less-608.tar.gz )。
下载后在任意目录下解压,然后通过Windows命令提示符访问对应位置。整个源代码包的结构如下:
1 | D:\linux\gcc\source\less-608>ls |
less的源代码包中提供了3个适用于windows系统的Makefile
,分别是Makefile.wnb, Makefile.wng, Makefile.wnm
,他们对应于三种不同的C++编译器,分别是Bolarnd C++ 、MinGW-w64和Microsoft Visual C++ 。在这三个Makefile
中,均标注了各自的编译方法,因此只需要按照其给出的方法编译即可。
三、编译方法
如前所述,less的源代码包中提供了编译所需的Makefile
文件,因此我们直接编译即可。
我们使用的编译器是MinGW-w64,编译指令如下:
1 | mingw32-make -f Makefile.wng REGEX_PACKAGE=regcomp-local |
参数REGEX_PACKAGE
指出了编译过程中应该链接到哪一个regex库。根据Makefile
中的说明,我们指定REGEX_PACKAGE=regcomp-local
即可,编译器会使用less源代码包自带的regex。
这里还有一个小插曲:
regex是一个正则表达式处理库,在Linux上自带,但是Windows上没有。默认编译选项指定REGEX_PACKAGE=posix
,这会导致编译器从系统中链接regex库。笔者最开始采取的方法是另外安装regex,然而在网上只找到一个2.7版的regex库,编译过程中发现其与编译器不兼容。经过许多摸索,终于发现参数REGEX_PACKAGE
的用法,遂设置REGEX_PACKAGE=regcomp-local
,并一次编译成功。
编译完成后,当前目录下会出现三个新的exe文件,分别是less.exe, lessecho.exe, lesskey.exe
。输入下列指令
1 | less.exe --version |
当看到下面的输出时,表明安装成功:
1 | less 608 (Spencer V8 regular expressions) |
四、使用
我们可以将less.exe, lessecho.exe, lesskey.exe
这几个可执行文件的路径加入到系统的环境变量PATH当中,这样以后需要打开大文件时,只需要运行 less <filename>
即可。
less提供了多个参数,其中比较有用的参数有两个:
1 | -N ......... --LINE-NUMBERS |
参数 -N
表示开启行号显示,参数 -S
表明长段落不换行显示(此时需要配合左右方向键进行浏览)。对于一些大文件,例如群体基因组变异文件VCF、制表符分隔的表格文件TSV等,这两个参数是极有用的。