less 工具 OpenHarmony PC适配实践目录工具概述主要用途适配过程遇到的问题与解决方案构建脚本说明总结工具概述less是一个功能强大的终端分页器terminal pager用于在终端中查看文本文件的内容。它是more命令的增强版本提供了更丰富的功能和更好的用户体验。主要特点双向滚动支持向前和向后滚动查看文件内容搜索功能支持向前和向后搜索文本标记功能可以在文件中设置标记快速跳转语法高亮支持代码语法高亮显示多文件支持可以同时打开多个文件终端兼容性兼容各种终端类型和终端模拟器效果版本信息项目名称less开源协议: GPL-3.0-or-later源码版本1.0.0许可证GPL 或 Less License目标平台: aarch64-linux-ohos依赖项: OpenHarmony SDK、Autotools (autoconf, automake)操作系统平台OpenHarmony PC源码地址:https://gitcode.com/gh_mirrors/less1/less官方网站https://www.greenwoodsoftware.com/less/主要用途1. 查看大型文件less特别适合查看大型日志文件或配置文件因为它不会一次性加载整个文件到内存中而是按需加载less/var/log/system.logless/etc/config.conf2. 查看命令输出可以将命令的输出通过管道传递给lesspsaux|lesshistory|less3. 代码查看支持语法高亮适合查看源代码文件lesssource.clessMakefile4. 交互式浏览提供了丰富的交互命令空格键向下翻页b向上翻页/向前搜索?向后搜索g跳转到文件开头G跳转到文件结尾q退出适配过程移植环境说明该命令基于build配置框架进行移植编译环境搭建可以参考文章《开源软件鸿蒙化适配与构建指南(交叉编译)》主要是ohos sdk的下载配置和build配置框架的下载使用说明。1. 项目结构less使用传统的 autotools 构建系统autoconf/automake需要先运行configure脚本生成Makefile。2. 构建系统分析构建工具autotools (configure make)编程语言C依赖库termcap/terminfo终端控制库特殊需求需要终端库支持但在交叉编译时无法运行测试程序3. 适配步骤步骤 1配置构建脚本创建build_ohos.sh脚本设置 OpenHarmony 交叉编译环境#!/bin/bash# less 工具 OpenHarmony 构建脚本exportLESS_INSTALL_HNP_PATH${HNP_PUBLIC_PATH}/less.org/less_1.0.0exportPREFIX${LESS_INSTALL_HNP_PATH}mkdir-p${LESS_INSTALL_HNP_PATH}步骤 2运行 configure配置构建系统指定目标平台shconfigure\--prefix${PREFIX}\--hostaarch64-linux-gnu\CC${CC}\CFLAGS${CFLAGS}\LDFLAGS${LDFLAGS}\TERMLIBS-ltermcap步骤 3修复配置问题由于交叉编译时configure无法运行测试程序需要手动修复defines.h中的宏定义。步骤 4编译和安装makeVERBOSE1makeinstall步骤 5打包 HNP使用 HNP 工具打包应用${HNP_TOOL}pack-i${LESS_INSTALL_HNP_PATH}-o${ARCHIVE_PATH}/tar-zvcf${ARCHIVE_PATH}/ohos_less_1.0.0.tar.gz less_1.0.0/遇到的问题与解决方案问题 1FILE类型未定义错误信息error: unknown type name FILE原因分析defines.h中HAVE_STDIO_H被设置为#undef导致stdio.h没有被包含FILE类型未定义。解决方案在build_ohos.sh中添加自动修复逻辑sed-i.baks/^#undef HAVE_STDIO_H$/#define HAVE_STDIO_H 1/defines.h问题 2PATTERN_TYPE类型未定义错误信息error: unknown type name PATTERN_TYPE原因分析less支持多种正则表达式库GNU regex、POSIX regex、PCRE 等但 OpenHarmony SDK 中这些库都不可用。PATTERN_TYPE类型定义在pattern.h中依赖于正则表达式库的宏定义。解决方案启用NO_REGEX宏使PATTERN_TYPE定义为void *sed-i.baks/^#undef NO_REGEX$/#define NO_REGEX 1/defines.h问题 3sprintf未声明警告错误信息warning: call to undeclared library function sprintf原因分析HAVE_SNPRINTF未定义代码回退到使用sprintf但sprintf未声明。解决方案启用HAVE_SNPRINTF使用snprintf替代sprintfsed-i.baks/^#undef HAVE_SNPRINTF$/#define HAVE_SNPRINTF 1/defines.h问题 4sgtty.h文件未找到错误信息fatal error: sgtty.h file not found原因分析screen.c中的包含逻辑会尝试包含sgtty.h旧式终端控制头文件但 OpenHarmony SDK 不支持这个文件。解决方案启用 POSIXtermios.h支持sed-i.baks/^#undef HAVE_TERMIOS_H$/#define HAVE_TERMIOS_H 1/defines.hsed-i.baks/^#undef HAVE_TERMIOS_FUNCS$/#define HAVE_TERMIOS_FUNCS 1/defines.h问题 5INT_MAX未定义错误信息error: use of undeclared identifier INT_MAX原因分析HAVE_LIMITS_H未定义limits.h没有被包含。解决方案启用HAVE_LIMITS_Hsed-i.baks/^#undef HAVE_LIMITS_H$/#define HAVE_LIMITS_H 1/defines.h问题 6termcap 函数未声明错误信息warning: call to undeclared function tgetflag warning: call to undeclared function tgetnum warning: call to undeclared function tgetstr原因分析OpenHarmony SDK 中没有termcap.h头文件termcap 函数未声明。解决方案创建termcap_stub.h和termcap_stub.c提供 termcap 函数的声明和 stub 实现termcap_stub.h#ifndefTERMCAP_STUB_H#defineTERMCAP_STUB_H#includestdio.hexterninttgetflag(constchar*id);externinttgetnum(constchar*id);externchar*tgetstr(constchar*id,char**area);externchar*tgoto(constchar*cap,intcol,introw);externinttgetent(char*bp,constchar*name);externinttputs(constchar*str,intaffcnt,int(*putc)(int));#ifndefTGETENT_OK#defineTGETENT_OK1#endif#endif/* TERMCAP_STUB_H */termcap_stub.c#includetermcap_stub.h#includestdlib.h#includestring.hinttgetflag(constchar*id){(void)id;return0;}inttgetnum(constchar*id){(void)id;return-1;}char*tgetstr(constchar*id,char**area){(void)id;(void)area;returnNULL;}char*tgoto(constchar*cap,intcol,introw){staticcharbuf[32];snprintf(buf,sizeof(buf),\033[%d;%dH,row1,col1);returnbuf;}inttgetent(char*bp,constchar*name){(void)bp;(void)name;returnTGETENT_OK;}inttputs(constchar*str,intaffcnt,int(*putc)(int)){(void)affcnt;if(str!NULLputc!NULL){while(*str){putc(*str);}}return0;}修改screen.c在找不到termcap.h时使用 stub#ifHAVE_TERMCAP_H#includetermcap.h#else/* OpenHarmony doesnt have termcap.h, use stub */#includetermcap_stub.h#endif问题 7termcap 函数链接错误错误信息ld.lld: error: undefined symbol: tgetstr ld.lld: error: undefined symbol: tgetent原因分析termcap_stub.o没有被添加到 Makefile 的 OBJ 变量中。解决方案在build_ohos.sh中添加逻辑自动将termcap_stub.o添加到 Makefileif[-f./termcap_stub.c]!grep-qtermcap_stubMakefile2/dev/null;thenechoAdding termcap_stub.c to Makefile...awk/^OBJ /{in_obj1} in_obj /xbuf\.\${O}/{sub(/$/, termcap_stub.${O}); in_obj0} {print}MakefileMakefile.tmpmvMakefile.tmp Makefile||\sed-i.bak/^\t.*xbuf\.\${O}/s/$/ termcap_stub.${O}/Makefile2/dev/null||\sed-i/^\t.*xbuf\.\${O}/s/$/ termcap_stub.${O}/Makefile2/dev/null||truefi问题 8open/time/strerror函数未声明错误信息warning: call to undeclared function open warning: call to undeclared function time error: static declaration of strerror follows non-static declaration原因分析相应的头文件宏定义未启用。解决方案启用HAVE_FCNTL_H、HAVE_TIME_H和HAVE_STRERRORsed-i.baks/^#undef HAVE_FCNTL_H$/#define HAVE_FCNTL_H 1/defines.hsed-i.baks/^#undef HAVE_TIME_H$/#define HAVE_TIME_H 1/defines.hsed-i.baks/^#undef HAVE_STRERROR$/#define HAVE_STRERROR 1/defines.h问题 9lsystem函数未定义错误信息ld.lld: error: undefined symbol: lsystem原因分析lsystem函数在lsystem.c中被#if HAVE_SYSTEM条件编译保护但HAVE_SYSTEM未定义。解决方案启用HAVE_SYSTEMsed-i.baks/^#undef HAVE_SYSTEM$/#define HAVE_SYSTEM 1/defines.h问题 10手册页文件缺失错误信息make: *** No rule to make target lesskey.nro, needed by install. Stop.原因分析make install需要lesskey.nro和lessecho.nro手册页文件但这些文件不存在。解决方案在安装前创建占位文件if[!-f./lesskey.nro];thencplesskey.nro.VER lesskey.nro2/dev/null||touchlesskey.nrofiif[!-f./lessecho.nro];thencplessecho.nro.VER lessecho.nro2/dev/null||touchlessecho.nrofi构建脚本说明build_ohos.sh 关键部分1. 环境设置exportLESS_INSTALL_HNP_PATH${HNP_PUBLIC_PATH}/less.org/less_1.0.0exportPREFIX${LESS_INSTALL_HNP_PATH}mkdir-p${LESS_INSTALL_HNP_PATH}2. Configure 配置shconfigure\--prefix${PREFIX}\--hostaarch64-linux-gnu\CC${CC}\CFLAGS${CFLAGS}\LDFLAGS${LDFLAGS}\TERMLIBS-ltermcap3. 自动修复 defines.h# 修复关键宏定义sed-i.baks/^#undef HAVE_STDIO_H$/#define HAVE_STDIO_H 1/defines.hsed-i.baks/^#undef HAVE_SNPRINTF$/#define HAVE_SNPRINTF 1/defines.hsed-i.baks/^#undef NO_REGEX$/#define NO_REGEX 1/defines.hsed-i.baks/^#undef HAVE_TERMIOS_H$/#define HAVE_TERMIOS_H 1/defines.hsed-i.baks/^#undef HAVE_TERMIOS_FUNCS$/#define HAVE_TERMIOS_FUNCS 1/defines.hsed-i.baks/^#undef HAVE_LIMITS_H$/#define HAVE_LIMITS_H 1/defines.hsed-i.baks/^#undef HAVE_FCNTL_H$/#define HAVE_FCNTL_H 1/defines.hsed-i.baks/^#undef HAVE_TIME_H$/#define HAVE_TIME_H 1/defines.hsed-i.baks/^#undef HAVE_STRERROR$/#define HAVE_STRERROR 1/defines.hsed-i.baks/^#undef HAVE_SYSTEM$/#define HAVE_SYSTEM 1/defines.h4. 添加 termcap_stub 到 Makefileif[-f./termcap_stub.c]!grep-qtermcap_stubMakefile2/dev/null;thenawk/^OBJ /{in_obj1} in_obj /xbuf\.\${O}/{sub(/$/, termcap_stub.${O}); in_obj0} {print}MakefileMakefile.tmpmvMakefile.tmp Makefilefi5. 创建手册页占位文件if[!-f./lesskey.nro];thencplesskey.nro.VER lesskey.nro2/dev/null||touchlesskey.nrofiif[!-f./lessecho.nro];thencplessecho.nro.VER lessecho.nro2/dev/null||touchlessecho.nrofi关键修复总结修复的宏定义宏定义修复前修复后用途HAVE_STDIO_H#undef#define HAVE_STDIO_H 1FILE 类型定义HAVE_SNPRINTF#undef#define HAVE_SNPRINTF 1使用 snprintfNO_REGEX#undef#define NO_REGEX 1PATTERN_TYPE 定义HAVE_TERMIOS_H#undef#define HAVE_TERMIOS_H 1POSIX termios 支持HAVE_TERMIOS_FUNCS#undef#define HAVE_TERMIOS_FUNCS 1termios 函数支持HAVE_LIMITS_H#undef#define HAVE_LIMITS_H 1INT_MAX 定义HAVE_FCNTL_H#undef#define HAVE_FCNTL_H 1open 函数声明HAVE_TIME_H#undef#define HAVE_TIME_H 1time 函数声明HAVE_STRERROR#undef#define HAVE_STRERROR 1使用系统 strerrorHAVE_SYSTEM#undef#define HAVE_SYSTEM 1lsystem 函数编译创建的新文件termcap_stub.h- termcap 函数声明termcap_stub.c- termcap 函数 stub 实现修改的文件screen.c- 添加 termcap_stub.h 包含逻辑build_ohos.sh- 添加自动修复和构建逻辑使用示例基本使用# 查看文件lessfilename.txt# 查看命令输出psaux|less# 搜索文本在 less 中/pattern# 向前搜索?pattern# 向后搜索n# 下一个匹配N# 上一个匹配常用命令命令功能空格键向下翻页b向上翻页g跳转到文件开头G跳转到文件结尾/pattern向前搜索?pattern向后搜索q退出h显示帮助总结适配难点交叉编译限制configure脚本无法运行测试程序需要手动修复配置依赖库缺失OpenHarmony SDK 中没有 termcap 库需要创建 stub 实现头文件缺失多个标准头文件的宏定义需要手动启用条件编译大量使用条件编译需要正确设置宏定义适配成果✅ 成功编译less、lesskey、lessecho三个可执行文件✅ 创建了 termcap stub 实现解决了终端控制库依赖问题✅ 修复了所有编译和链接错误✅ 实现了自动化构建脚本支持一键构建经验总结交叉编译适配对于使用 autotools 的项目需要仔细检查configure生成的defines.h手动修复无法正确检测的宏定义依赖库处理对于缺失的系统库可以创建 stub 实现提供最小功能支持自动化构建使用脚本自动修复配置问题提高构建效率文档记录详细记录遇到的问题和解决方案便于后续维护后续优化建议termcap 功能增强可以改进termcap_stub.c的实现提供更完整的终端控制功能正则表达式支持如果 OpenHarmony SDK 未来支持正则表达式库可以启用相应的宏定义测试验证在实际的 OpenHarmony 设备上测试less的功能确保所有特性正常工作欢迎加入开源鸿蒙PC社区https://harmonypc.csdn.net/
less 工具 OpenHarmony PC适配实践
less 工具 OpenHarmony PC适配实践目录工具概述主要用途适配过程遇到的问题与解决方案构建脚本说明总结工具概述less是一个功能强大的终端分页器terminal pager用于在终端中查看文本文件的内容。它是more命令的增强版本提供了更丰富的功能和更好的用户体验。主要特点双向滚动支持向前和向后滚动查看文件内容搜索功能支持向前和向后搜索文本标记功能可以在文件中设置标记快速跳转语法高亮支持代码语法高亮显示多文件支持可以同时打开多个文件终端兼容性兼容各种终端类型和终端模拟器效果版本信息项目名称less开源协议: GPL-3.0-or-later源码版本1.0.0许可证GPL 或 Less License目标平台: aarch64-linux-ohos依赖项: OpenHarmony SDK、Autotools (autoconf, automake)操作系统平台OpenHarmony PC源码地址:https://gitcode.com/gh_mirrors/less1/less官方网站https://www.greenwoodsoftware.com/less/主要用途1. 查看大型文件less特别适合查看大型日志文件或配置文件因为它不会一次性加载整个文件到内存中而是按需加载less/var/log/system.logless/etc/config.conf2. 查看命令输出可以将命令的输出通过管道传递给lesspsaux|lesshistory|less3. 代码查看支持语法高亮适合查看源代码文件lesssource.clessMakefile4. 交互式浏览提供了丰富的交互命令空格键向下翻页b向上翻页/向前搜索?向后搜索g跳转到文件开头G跳转到文件结尾q退出适配过程移植环境说明该命令基于build配置框架进行移植编译环境搭建可以参考文章《开源软件鸿蒙化适配与构建指南(交叉编译)》主要是ohos sdk的下载配置和build配置框架的下载使用说明。1. 项目结构less使用传统的 autotools 构建系统autoconf/automake需要先运行configure脚本生成Makefile。2. 构建系统分析构建工具autotools (configure make)编程语言C依赖库termcap/terminfo终端控制库特殊需求需要终端库支持但在交叉编译时无法运行测试程序3. 适配步骤步骤 1配置构建脚本创建build_ohos.sh脚本设置 OpenHarmony 交叉编译环境#!/bin/bash# less 工具 OpenHarmony 构建脚本exportLESS_INSTALL_HNP_PATH${HNP_PUBLIC_PATH}/less.org/less_1.0.0exportPREFIX${LESS_INSTALL_HNP_PATH}mkdir-p${LESS_INSTALL_HNP_PATH}步骤 2运行 configure配置构建系统指定目标平台shconfigure\--prefix${PREFIX}\--hostaarch64-linux-gnu\CC${CC}\CFLAGS${CFLAGS}\LDFLAGS${LDFLAGS}\TERMLIBS-ltermcap步骤 3修复配置问题由于交叉编译时configure无法运行测试程序需要手动修复defines.h中的宏定义。步骤 4编译和安装makeVERBOSE1makeinstall步骤 5打包 HNP使用 HNP 工具打包应用${HNP_TOOL}pack-i${LESS_INSTALL_HNP_PATH}-o${ARCHIVE_PATH}/tar-zvcf${ARCHIVE_PATH}/ohos_less_1.0.0.tar.gz less_1.0.0/遇到的问题与解决方案问题 1FILE类型未定义错误信息error: unknown type name FILE原因分析defines.h中HAVE_STDIO_H被设置为#undef导致stdio.h没有被包含FILE类型未定义。解决方案在build_ohos.sh中添加自动修复逻辑sed-i.baks/^#undef HAVE_STDIO_H$/#define HAVE_STDIO_H 1/defines.h问题 2PATTERN_TYPE类型未定义错误信息error: unknown type name PATTERN_TYPE原因分析less支持多种正则表达式库GNU regex、POSIX regex、PCRE 等但 OpenHarmony SDK 中这些库都不可用。PATTERN_TYPE类型定义在pattern.h中依赖于正则表达式库的宏定义。解决方案启用NO_REGEX宏使PATTERN_TYPE定义为void *sed-i.baks/^#undef NO_REGEX$/#define NO_REGEX 1/defines.h问题 3sprintf未声明警告错误信息warning: call to undeclared library function sprintf原因分析HAVE_SNPRINTF未定义代码回退到使用sprintf但sprintf未声明。解决方案启用HAVE_SNPRINTF使用snprintf替代sprintfsed-i.baks/^#undef HAVE_SNPRINTF$/#define HAVE_SNPRINTF 1/defines.h问题 4sgtty.h文件未找到错误信息fatal error: sgtty.h file not found原因分析screen.c中的包含逻辑会尝试包含sgtty.h旧式终端控制头文件但 OpenHarmony SDK 不支持这个文件。解决方案启用 POSIXtermios.h支持sed-i.baks/^#undef HAVE_TERMIOS_H$/#define HAVE_TERMIOS_H 1/defines.hsed-i.baks/^#undef HAVE_TERMIOS_FUNCS$/#define HAVE_TERMIOS_FUNCS 1/defines.h问题 5INT_MAX未定义错误信息error: use of undeclared identifier INT_MAX原因分析HAVE_LIMITS_H未定义limits.h没有被包含。解决方案启用HAVE_LIMITS_Hsed-i.baks/^#undef HAVE_LIMITS_H$/#define HAVE_LIMITS_H 1/defines.h问题 6termcap 函数未声明错误信息warning: call to undeclared function tgetflag warning: call to undeclared function tgetnum warning: call to undeclared function tgetstr原因分析OpenHarmony SDK 中没有termcap.h头文件termcap 函数未声明。解决方案创建termcap_stub.h和termcap_stub.c提供 termcap 函数的声明和 stub 实现termcap_stub.h#ifndefTERMCAP_STUB_H#defineTERMCAP_STUB_H#includestdio.hexterninttgetflag(constchar*id);externinttgetnum(constchar*id);externchar*tgetstr(constchar*id,char**area);externchar*tgoto(constchar*cap,intcol,introw);externinttgetent(char*bp,constchar*name);externinttputs(constchar*str,intaffcnt,int(*putc)(int));#ifndefTGETENT_OK#defineTGETENT_OK1#endif#endif/* TERMCAP_STUB_H */termcap_stub.c#includetermcap_stub.h#includestdlib.h#includestring.hinttgetflag(constchar*id){(void)id;return0;}inttgetnum(constchar*id){(void)id;return-1;}char*tgetstr(constchar*id,char**area){(void)id;(void)area;returnNULL;}char*tgoto(constchar*cap,intcol,introw){staticcharbuf[32];snprintf(buf,sizeof(buf),\033[%d;%dH,row1,col1);returnbuf;}inttgetent(char*bp,constchar*name){(void)bp;(void)name;returnTGETENT_OK;}inttputs(constchar*str,intaffcnt,int(*putc)(int)){(void)affcnt;if(str!NULLputc!NULL){while(*str){putc(*str);}}return0;}修改screen.c在找不到termcap.h时使用 stub#ifHAVE_TERMCAP_H#includetermcap.h#else/* OpenHarmony doesnt have termcap.h, use stub */#includetermcap_stub.h#endif问题 7termcap 函数链接错误错误信息ld.lld: error: undefined symbol: tgetstr ld.lld: error: undefined symbol: tgetent原因分析termcap_stub.o没有被添加到 Makefile 的 OBJ 变量中。解决方案在build_ohos.sh中添加逻辑自动将termcap_stub.o添加到 Makefileif[-f./termcap_stub.c]!grep-qtermcap_stubMakefile2/dev/null;thenechoAdding termcap_stub.c to Makefile...awk/^OBJ /{in_obj1} in_obj /xbuf\.\${O}/{sub(/$/, termcap_stub.${O}); in_obj0} {print}MakefileMakefile.tmpmvMakefile.tmp Makefile||\sed-i.bak/^\t.*xbuf\.\${O}/s/$/ termcap_stub.${O}/Makefile2/dev/null||\sed-i/^\t.*xbuf\.\${O}/s/$/ termcap_stub.${O}/Makefile2/dev/null||truefi问题 8open/time/strerror函数未声明错误信息warning: call to undeclared function open warning: call to undeclared function time error: static declaration of strerror follows non-static declaration原因分析相应的头文件宏定义未启用。解决方案启用HAVE_FCNTL_H、HAVE_TIME_H和HAVE_STRERRORsed-i.baks/^#undef HAVE_FCNTL_H$/#define HAVE_FCNTL_H 1/defines.hsed-i.baks/^#undef HAVE_TIME_H$/#define HAVE_TIME_H 1/defines.hsed-i.baks/^#undef HAVE_STRERROR$/#define HAVE_STRERROR 1/defines.h问题 9lsystem函数未定义错误信息ld.lld: error: undefined symbol: lsystem原因分析lsystem函数在lsystem.c中被#if HAVE_SYSTEM条件编译保护但HAVE_SYSTEM未定义。解决方案启用HAVE_SYSTEMsed-i.baks/^#undef HAVE_SYSTEM$/#define HAVE_SYSTEM 1/defines.h问题 10手册页文件缺失错误信息make: *** No rule to make target lesskey.nro, needed by install. Stop.原因分析make install需要lesskey.nro和lessecho.nro手册页文件但这些文件不存在。解决方案在安装前创建占位文件if[!-f./lesskey.nro];thencplesskey.nro.VER lesskey.nro2/dev/null||touchlesskey.nrofiif[!-f./lessecho.nro];thencplessecho.nro.VER lessecho.nro2/dev/null||touchlessecho.nrofi构建脚本说明build_ohos.sh 关键部分1. 环境设置exportLESS_INSTALL_HNP_PATH${HNP_PUBLIC_PATH}/less.org/less_1.0.0exportPREFIX${LESS_INSTALL_HNP_PATH}mkdir-p${LESS_INSTALL_HNP_PATH}2. Configure 配置shconfigure\--prefix${PREFIX}\--hostaarch64-linux-gnu\CC${CC}\CFLAGS${CFLAGS}\LDFLAGS${LDFLAGS}\TERMLIBS-ltermcap3. 自动修复 defines.h# 修复关键宏定义sed-i.baks/^#undef HAVE_STDIO_H$/#define HAVE_STDIO_H 1/defines.hsed-i.baks/^#undef HAVE_SNPRINTF$/#define HAVE_SNPRINTF 1/defines.hsed-i.baks/^#undef NO_REGEX$/#define NO_REGEX 1/defines.hsed-i.baks/^#undef HAVE_TERMIOS_H$/#define HAVE_TERMIOS_H 1/defines.hsed-i.baks/^#undef HAVE_TERMIOS_FUNCS$/#define HAVE_TERMIOS_FUNCS 1/defines.hsed-i.baks/^#undef HAVE_LIMITS_H$/#define HAVE_LIMITS_H 1/defines.hsed-i.baks/^#undef HAVE_FCNTL_H$/#define HAVE_FCNTL_H 1/defines.hsed-i.baks/^#undef HAVE_TIME_H$/#define HAVE_TIME_H 1/defines.hsed-i.baks/^#undef HAVE_STRERROR$/#define HAVE_STRERROR 1/defines.hsed-i.baks/^#undef HAVE_SYSTEM$/#define HAVE_SYSTEM 1/defines.h4. 添加 termcap_stub 到 Makefileif[-f./termcap_stub.c]!grep-qtermcap_stubMakefile2/dev/null;thenawk/^OBJ /{in_obj1} in_obj /xbuf\.\${O}/{sub(/$/, termcap_stub.${O}); in_obj0} {print}MakefileMakefile.tmpmvMakefile.tmp Makefilefi5. 创建手册页占位文件if[!-f./lesskey.nro];thencplesskey.nro.VER lesskey.nro2/dev/null||touchlesskey.nrofiif[!-f./lessecho.nro];thencplessecho.nro.VER lessecho.nro2/dev/null||touchlessecho.nrofi关键修复总结修复的宏定义宏定义修复前修复后用途HAVE_STDIO_H#undef#define HAVE_STDIO_H 1FILE 类型定义HAVE_SNPRINTF#undef#define HAVE_SNPRINTF 1使用 snprintfNO_REGEX#undef#define NO_REGEX 1PATTERN_TYPE 定义HAVE_TERMIOS_H#undef#define HAVE_TERMIOS_H 1POSIX termios 支持HAVE_TERMIOS_FUNCS#undef#define HAVE_TERMIOS_FUNCS 1termios 函数支持HAVE_LIMITS_H#undef#define HAVE_LIMITS_H 1INT_MAX 定义HAVE_FCNTL_H#undef#define HAVE_FCNTL_H 1open 函数声明HAVE_TIME_H#undef#define HAVE_TIME_H 1time 函数声明HAVE_STRERROR#undef#define HAVE_STRERROR 1使用系统 strerrorHAVE_SYSTEM#undef#define HAVE_SYSTEM 1lsystem 函数编译创建的新文件termcap_stub.h- termcap 函数声明termcap_stub.c- termcap 函数 stub 实现修改的文件screen.c- 添加 termcap_stub.h 包含逻辑build_ohos.sh- 添加自动修复和构建逻辑使用示例基本使用# 查看文件lessfilename.txt# 查看命令输出psaux|less# 搜索文本在 less 中/pattern# 向前搜索?pattern# 向后搜索n# 下一个匹配N# 上一个匹配常用命令命令功能空格键向下翻页b向上翻页g跳转到文件开头G跳转到文件结尾/pattern向前搜索?pattern向后搜索q退出h显示帮助总结适配难点交叉编译限制configure脚本无法运行测试程序需要手动修复配置依赖库缺失OpenHarmony SDK 中没有 termcap 库需要创建 stub 实现头文件缺失多个标准头文件的宏定义需要手动启用条件编译大量使用条件编译需要正确设置宏定义适配成果✅ 成功编译less、lesskey、lessecho三个可执行文件✅ 创建了 termcap stub 实现解决了终端控制库依赖问题✅ 修复了所有编译和链接错误✅ 实现了自动化构建脚本支持一键构建经验总结交叉编译适配对于使用 autotools 的项目需要仔细检查configure生成的defines.h手动修复无法正确检测的宏定义依赖库处理对于缺失的系统库可以创建 stub 实现提供最小功能支持自动化构建使用脚本自动修复配置问题提高构建效率文档记录详细记录遇到的问题和解决方案便于后续维护后续优化建议termcap 功能增强可以改进termcap_stub.c的实现提供更完整的终端控制功能正则表达式支持如果 OpenHarmony SDK 未来支持正则表达式库可以启用相应的宏定义测试验证在实际的 OpenHarmony 设备上测试less的功能确保所有特性正常工作欢迎加入开源鸿蒙PC社区https://harmonypc.csdn.net/