目录
- 项目简介
- [mdcat 是什么](#mdcat 是什么)
- [mdcat 的主要特性](#mdcat 的主要特性)
- [mdcat 的使用方法](#mdcat 的使用方法)
- [HarmonyOS 适配过程](#HarmonyOS 适配过程)
- 环境准备
- 构建脚本详解
- 关键问题解决
- [__fd_chk 符号问题](#__fd_chk 符号问题)
- [curl OpenSSL 依赖问题](#curl OpenSSL 依赖问题)
- [dead_code 警告问题](#dead_code 警告问题)
- [HNP 包配置](#HNP 包配置)
- 构建结果
- 使用示例
- 总结
- FAQ
- 相关链接
项目简介
mdcat 是一个用 Rust 编写的命令行工具,用于在终端中显示 Markdown 文档。它类似于 cat 命令,但专门用于 Markdown 文件,提供了语法高亮、表格格式化、链接处理等功能,让 Markdown 文档在终端中更加美观和易读。
仓库地址: git@gitcode.com:nutpi/mdcat.git
版本: v1.0.0
Tag: 1.0.0_ohos
mdcat 是什么
mdcat 是一个命令行工具,用于在终端中显示和渲染 Markdown 文档。它可以将 Markdown 文件转换为格式化的终端输出,包括语法高亮、表格对齐、链接处理等功能。
主要优势
- 语法高亮:支持代码块的语法高亮
- 表格格式化:自动对齐表格列
- 链接处理:显示和处理 Markdown 链接
- 终端优化:针对终端显示优化输出
- 高性能:Rust 编写,单二进制文件,运行速度快
- 跨平台:支持 Windows、macOS、Linux 等平台
与 cat 的对比
| 特性 | cat | mdcat |
|---|---|---|
| Markdown 渲染 | ❌ | ✅ |
| 语法高亮 | ❌ | ✅ |
| 表格格式化 | ❌ | ✅ |
| 链接处理 | ❌ | ✅ |
| 终端优化 | ❌ | ✅ |
mdcat 的主要特性
1. Markdown 渲染
- 支持标准 Markdown 语法
- 支持 GitHub Flavored Markdown (GFM)
- 支持表格、代码块、链接等元素
2. 语法高亮
- 支持多种编程语言的语法高亮
- 使用
syntect库进行语法高亮 - 支持自定义语法主题
3. 表格格式化
- 自动对齐表格列
- 支持多列表格
- 优化表格在终端中的显示
4. 链接处理
- 显示链接文本和 URL
- 支持相对路径和绝对路径
- 可以处理远程资源(HTTP/HTTPS)
5. 终端优化
- 根据终端宽度自动调整输出
- 支持颜色输出(如果终端支持)
- 优化长文本的显示
mdcat 的使用方法
基本用法
bash
# 显示 Markdown 文件
mdcat README.md
# 显示多个文件
mdcat file1.md file2.md
# 从标准输入读取
cat README.md | mdcat
# 显示远程 Markdown 文件(如果支持)
mdcat https://example.com/README.md
常用选项
显示选项
bash
# 禁用分页(类似 cat)
mdcat --no-pager README.md
# 禁用颜色
mdcat --no-colour README.md
# 显示行号
mdcat --number README.md
格式化选项
bash
# 指定终端宽度
mdcat --columns 80 README.md
# 禁用表格格式化
mdcat --no-tables README.md
# 禁用语法高亮
mdcat --no-syntax-highlighting README.md
实际使用示例
bash
# 查看项目 README
mdcat README.md
# 查看文档目录
mdcat docs/*.md
# 在终端中查看 Markdown 文档
mdcat --no-pager CHANGELOG.md
# 查看代码文档
mdcat --syntax-highlighting src/main.rs.md
# 查看表格数据
mdcat data.md | less
HarmonyOS 适配过程
项目特点
mdcat 是一个 Rust 项目,使用 Cargo 作为构建系统。与之前适配的其他 Rust 项目(exa、dog、tre、tokei)类似,但遇到了更复杂的依赖问题,特别是 curl 和 curl-sys 的链接问题。
适配挑战
- 构建系统差异:从 Makefile 转向 Cargo
- 交叉编译配置:需要配置 Rust 工具链和目标平台
- 链接器问题 :LLD 不支持
--as-needed选项 - 符号缺失问题 :
__fd_chk符号在 HarmonyOS musl libc 中不存在 - 依赖库问题 :
curl-sys依赖 OpenSSL,在交叉编译时难以处理 - 代码警告问题 :
dead_code警告被当作错误处理
环境准备
1. 系统要求
- macOS(本文示例)或 Linux
- Rust 工具链(rustc 和 cargo)
- HarmonyOS SDK
- Python 3(用于构建脚本)
2. 安装 Rust 工具链
bash
# 检查 Rust 版本
rustc --version
cargo --version
# 如果未安装,使用 rustup 安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
3. 安装交叉编译目标
bash
# 添加 aarch64-unknown-linux-musl 目标
rustup target add aarch64-unknown-linux-musl
注意 :HarmonyOS 使用 musl libc,因此选择 aarch64-unknown-linux-musl 作为目标平台。
4. 环境变量设置
构建脚本会自动设置以下环境变量:
bash
export CC=${COMPILER_TOOLCHAIN}clang
export CXX=${COMPILER_TOOLCHAIN}clang++
export AR=${COMPILER_TOOLCHAIN}llvm-ar
export RANLIB=${COMPILER_TOOLCHAIN}llvm-ranlib
export STRIP=${COMPILER_TOOLCHAIN}llvm-strip
构建脚本详解
build_ohos.sh 完整代码
bash
export TREE_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/mdcat.org/mdcat_1.0.0
# 创建安装目录
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1
# 设置 Rust 交叉编译目标
export CARGO_TARGET_DIR=${PWD}/target
export TARGET=aarch64-unknown-linux-musl
# 配置 cargo 使用 HarmonyOS 工具链
export CC_aarch64_unknown_linux_musl=${CC}
export CXX_aarch64_unknown_linux_musl=${CXX}
export AR_aarch64_unknown_linux_musl=${AR}
export RANLIB_aarch64_unknown_linux_musl=${RANLIB}
export STRIP_aarch64_unknown_linux_musl=${STRIP}
# 设置链接器
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=${CC}
# 创建 .cargo 配置目录
mkdir -p .cargo
# 从环境变量获取 SDK 路径
SDK_PATH=${OHOS_SDK:-/Users/jianguo/Desktop/ohosdk}
# 创建兼容层目录
COMPAT_DIR="${PWD}/.harmonyos_compat"
mkdir -p "${COMPAT_DIR}"
# 创建链接器包装脚本,过滤掉 --as-needed 选项(LLD 不支持)
LINKER_WRAPPER=$(mktemp)
cat > "${LINKER_WRAPPER}" << LINKER_EOF
#!/bin/bash
# 链接器包装脚本:过滤掉 LLD 不支持的选项
ARGS=()
for arg in "\$@"; do
case "\$arg" in
*--as-needed*)
# 跳过这个选项
;;
-Wl,--as-needed)
# 跳过这个选项
;;
-Wl,--no-as-needed)
# 也跳过这个选项(LLD 不支持)
;;
*)
ARGS+=("\$arg")
;;
esac
done
# 调用实际的链接器
exec "${CC}" "\${ARGS[@]}"
LINKER_EOF
chmod +x "${LINKER_WRAPPER}"
# 创建兼容层来解决 __fd_chk 符号问题
cat > "${COMPAT_DIR}/fd_chk.c" << 'FD_CHK_EOF'
#include <unistd.h>
#include <fcntl.h>
// 兼容实现 __fd_chk(musl libc 的调试函数)
void __fd_chk(int fd) {
if (fd >= 0) {
fcntl(fd, F_GETFD);
}
}
FD_CHK_EOF
# 编译兼容层
echo "Building compatibility layer for __fd_chk..."
${CC} -c -fPIC -o "${COMPAT_DIR}/fd_chk.o" "${COMPAT_DIR}/fd_chk.c" \
--target=aarch64-linux-ohos \
--sysroot=${SDK_PATH}/native/sysroot \
${CFLAGS} || {
echo "Warning: Failed to build compatibility layer"
}
# 创建静态库
if [ -f "${COMPAT_DIR}/fd_chk.o" ]; then
${AR} rcs "${COMPAT_DIR}/libfd_chk.a" "${COMPAT_DIR}/fd_chk.o" || {
echo "Warning: Failed to create compatibility library"
}
echo "Created compatibility library: ${COMPAT_DIR}/libfd_chk.a"
fi
# 动态生成 .cargo/config.toml
cat > .cargo/config.toml << EOF
[target.aarch64-unknown-linux-musl]
linker = "${LINKER_WRAPPER}"
rustflags = [
"-C", "link-arg=--target=aarch64-linux-ohos",
"-C", "link-arg=--sysroot=${SDK_PATH}/native/sysroot",
"-C", "link-arg=-fuse-ld=lld",
"-C", "link-arg=--ld-path=${SDK_PATH}/native/llvm/bin/ld.lld",
"-C", "link-arg=-L${SDK_PATH}/native/sysroot/usr/lib",
"-C", "link-arg=-lc",
"-C", "link-arg=-L${COMPAT_DIR}",
"-C", "link-arg=-lfd_chk",
]
EOF
# 清理之前的构建
cargo clean 2>/dev/null || true
# 修改 Cargo.toml 来禁用 curl 的默认 features
cp Cargo.toml Cargo.toml.bak
if grep -q 'curl = "0.4.47"' Cargo.toml; then
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' 's|curl = "0.4.47"|curl = { version = "0.4.47", default-features = false }|' Cargo.toml
else
sed -i 's|curl = "0.4.47"|curl = { version = "0.4.47", default-features = false }|' Cargo.toml
fi
echo "Modified Cargo.toml to disable curl default features"
fi
# 设置环境变量来禁用 curl-sys 的某些功能
export CURL_SYS_USE_PKG_CONFIG=0
export PKG_CONFIG_ALLOW_CROSS=0
export CURL_STATIC=1
export CURL_DISABLE_SOCKETPAIR=1
export CURL_DISABLE_PIPE=1
# 修复 pulldown-cmark-mdcat 中的 dead_code 错误
if [ -f "pulldown-cmark-mdcat/src/terminal/osc.rs" ]; then
cp pulldown-cmark-mdcat/src/terminal/osc.rs pulldown-cmark-mdcat/src/terminal/osc.rs.bak
if command -v perl >/dev/null 2>&1; then
perl -i -pe 's/^pub struct Osc8Links;/#[allow(dead_code)]\n$&/' pulldown-cmark-mdcat/src/terminal/osc.rs
elif [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' 's|^pub struct Osc8Links;|#[allow(dead_code)]\
&|' pulldown-cmark-mdcat/src/terminal/osc.rs
else
sed -i 's|^pub struct Osc8Links;|#[allow(dead_code)]\n&|' pulldown-cmark-mdcat/src/terminal/osc.rs
fi
echo "Fixed dead_code warning in pulldown-cmark-mdcat"
fi
# 构建 release 版本
echo "Building mdcat with cargo..."
cargo build --release --target ${TARGET} --verbose || {
echo "Error: Cargo build failed"
# 恢复原始文件
mv Cargo.toml.bak Cargo.toml 2>/dev/null || true
if [ -f "pulldown-cmark-mdcat/src/terminal/osc.rs.bak" ]; then
mv pulldown-cmark-mdcat/src/terminal/osc.rs.bak pulldown-cmark-mdcat/src/terminal/osc.rs 2>/dev/null || true
fi
exit 1
}
# 恢复原始文件
mv Cargo.toml.bak Cargo.toml 2>/dev/null || true
if [ -f "pulldown-cmark-mdcat/src/terminal/osc.rs.bak" ]; then
mv pulldown-cmark-mdcat/src/terminal/osc.rs.bak pulldown-cmark-mdcat/src/terminal/osc.rs 2>/dev/null || true
fi
# 检查构建产物
BINARY_PATH=${CARGO_TARGET_DIR}/${TARGET}/release/mdcat
if [ ! -f "${BINARY_PATH}" ]; then
echo "Error: Binary not found at ${BINARY_PATH}"
exit 1
fi
# 安装二进制文件
cp ${BINARY_PATH} ${TREE_INSTALL_HNP_PATH}/usr/bin/mdcat
chmod +x ${TREE_INSTALL_HNP_PATH}/usr/bin/mdcat
# 复制手册页(如果存在)
if [ -f "mdcat.1" ]; then
cp mdcat.1 ${TREE_INSTALL_HNP_PATH}/usr/share/man/man1/ 2>/dev/null || true
fi
# 复制 hnp.json 并打包
cp hnp.json ${TREE_INSTALL_HNP_PATH}/
pushd ${TREE_INSTALL_HNP_PATH}/../
${HNP_TOOL} pack -i ${TREE_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
tar -zvcf ${ARCHIVE_PATH}/ohos_mdcat_1.0.0.tar.gz mdcat_1.0.0/
popd
# 打印构建结果
echo ""
echo "=========================================="
echo "Build completed successfully!"
echo "=========================================="
echo "HNP Package: ${ARCHIVE_PATH}/mdcat.org_mdcat_1.0.0.hnp"
echo "Tar Archive: ${ARCHIVE_PATH}/ohos_mdcat_1.0.0.tar.gz"
echo "Installation Path: ${TREE_INSTALL_HNP_PATH}"
echo "=========================================="
echo ""
脚本关键点解析
1. 链接器包装脚本
bash
LINKER_WRAPPER=$(mktemp)
cat > "${LINKER_WRAPPER}" << LINKER_EOF
#!/bin/bash
# 过滤掉 LLD 不支持的选项
ARGS=()
for arg in "\$@"; do
case "\$arg" in
*--as-needed*)
;;
-Wl,--as-needed)
;;
-Wl,--no-as-needed)
;;
*)
ARGS+=("\$arg")
;;
esac
done
exec "${CC}" "\${ARGS[@]}"
LINKER_EOF
作用 :过滤掉 LLD 不支持的 --as-needed 选项,避免链接错误。
2. 兼容层库
bash
# 创建兼容层来解决 __fd_chk 符号问题
cat > "${COMPAT_DIR}/fd_chk.c" << 'FD_CHK_EOF'
#include <unistd.h>
#include <fcntl.h>
void __fd_chk(int fd) {
if (fd >= 0) {
fcntl(fd, F_GETFD);
}
}
FD_CHK_EOF
# 编译为静态库
${CC} -c -fPIC -o "${COMPAT_DIR}/fd_chk.o" "${COMPAT_DIR}/fd_chk.c" ...
${AR} rcs "${COMPAT_DIR}/libfd_chk.a" "${COMPAT_DIR}/fd_chk.o"
作用 :提供 __fd_chk 函数的兼容实现,解决符号缺失问题。
3. Cargo.toml 动态修改
bash
# 禁用 curl 的默认 features
sed -i '' 's|curl = "0.4.47"|curl = { version = "0.4.47", default-features = false }|' Cargo.toml
作用:禁用 curl 的 HTTPS 支持,避免 OpenSSL 依赖。
4. 环境变量设置
bash
export CURL_SYS_USE_PKG_CONFIG=0
export PKG_CONFIG_ALLOW_CROSS=0
export CURL_STATIC=1
export CURL_DISABLE_SOCKETPAIR=1
export CURL_DISABLE_PIPE=1
作用 :控制 curl-sys 的构建行为,避免链接系统库。
5. 源代码修改
bash
# 修复 dead_code 警告
perl -i -pe 's/^pub struct Osc8Links;/#[allow(dead_code)]\n$&/' pulldown-cmark-mdcat/src/terminal/osc.rs
作用 :在未使用的结构体上添加 #[allow(dead_code)] 属性,避免编译错误。
关键问题解决
问题 1:构建系统错误
错误信息:
make: *** No rule to make target `clean'. Stop.
make: *** No targets specified and no makefile found. Stop.
原因:mdcat 是 Rust 项目,不使用 Makefile,应该使用 Cargo。
解决方案 :将构建脚本从 make 改为 cargo build。
问题 2:链接器选项错误
错误信息:
ld.lld: unknown option: --as-needed
原因 :LLD 链接器不支持 --as-needed 选项。
解决方案:创建链接器包装脚本,过滤掉不支持的选项。
问题 3:__fd_chk 符号缺失
错误信息:
ld.lld: error: undefined symbol: __fd_chk
>>> referenced by select.c
>>> 4da0da058b5259b3-select.o:(Curl_poll) in archive libcurl_sys-7a5c8b5fe811d08c.rlib
原因 :HarmonyOS 的 musl libc 可能没有提供 __fd_chk 函数。
解决方案 :创建兼容层库,提供 __fd_chk 函数的实现。
问题 4:curl OpenSSL 依赖
错误信息:
error: failed to run custom build command for `openssl-sys v0.9.104`
原因 :curl-sys 依赖系统的 OpenSSL 库,在交叉编译时难以配置。
解决方案:禁用 curl 的默认 features,避免 HTTPS 支持。
问题 5:dead_code 警告
错误信息:
error: struct Osc8Links is never constructed
--> pulldown-cmark-mdcat/src/terminal/osc.rs:XX:XX
|
XX | pub struct Osc8Links;
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[deny(warnings)]` on by default
原因 :pulldown-cmark-mdcat 使用了 #![deny(warnings)],将警告当作错误。
解决方案 :在未使用的结构体上添加 #[allow(dead_code)] 属性。
__fd_chk 符号问题
问题分析
__fd_chk 是 musl libc 的一个调试函数,用于检查文件描述符的有效性。HarmonyOS 的 musl libc 可能没有提供这个函数,导致链接错误。
错误信息
ld.lld: error: undefined symbol: __fd_chk
>>> referenced by select.c
>>> 4da0da058b5259b3-select.o:(Curl_poll) in archive libcurl_sys-7a5c8b5fe811d08c.rlib
解决方案
创建兼容层库,提供 __fd_chk 函数的实现:
c
#include <unistd.h>
#include <fcntl.h>
// 兼容实现 __fd_chk(musl libc 的调试函数)
void __fd_chk(int fd) {
// 简单的实现:使用 fcntl 检查文件描述符是否有效
if (fd >= 0) {
fcntl(fd, F_GETFD);
}
}
实现特点:
- 使用
fcntl检查文件描述符有效性 - 简单的实现,满足链接要求
- 编译为静态库,链接到最终二进制文件
链接配置
在 .cargo/config.toml 中添加兼容层库的链接路径:
toml
rustflags = [
...
"-C", "link-arg=-L${COMPAT_DIR}",
"-C", "link-arg=-lfd_chk",
]
curl OpenSSL 依赖问题
问题分析
mdcat 的 curl 依赖默认启用 HTTPS 支持,这需要 OpenSSL 库。在交叉编译时:
- 系统 OpenSSL 不匹配:macOS 上的 OpenSSL 是为 macOS 编译的,不能用于 HarmonyOS
- 交叉编译 OpenSSL 复杂:需要为 HarmonyOS 交叉编译 OpenSSL,过程复杂
- 依赖链问题:OpenSSL 的依赖链很长,容易出错
解决方案
禁用 curl 的默认 features,避免 HTTPS 支持:
bash
# 修改 Cargo.toml
sed -i '' 's|curl = "0.4.47"|curl = { version = "0.4.47", default-features = false }|' Cargo.toml
影响:
- ✅ 避免了 OpenSSL 依赖
- ✅ 简化了交叉编译过程
- ❌ 失去了 HTTPS 支持(只能使用 HTTP 和本地文件)
环境变量设置
设置环境变量来控制 curl-sys 的构建行为:
bash
export CURL_SYS_USE_PKG_CONFIG=0
export PKG_CONFIG_ALLOW_CROSS=0
export CURL_STATIC=1
export CURL_DISABLE_SOCKETPAIR=1
export CURL_DISABLE_PIPE=1
作用:
CURL_SYS_USE_PKG_CONFIG=0:不使用 pkg-configPKG_CONFIG_ALLOW_CROSS=0:不允许交叉编译使用 pkg-configCURL_STATIC=1:使用静态链接CURL_DISABLE_SOCKETPAIR=1:禁用 socketpair 功能CURL_DISABLE_PIPE=1:禁用 pipe 功能
dead_code 警告问题
问题分析
pulldown-cmark-mdcat 使用了 #![deny(warnings)],将所有警告当作错误。Osc8Links 结构体未使用,导致编译失败。
错误信息
error: struct Osc8Links is never constructed
--> pulldown-cmark-mdcat/src/terminal/osc.rs:XX:XX
|
XX | pub struct Osc8Links;
| ^^^^^^^^^^^^^^^^^^^^^
解决方案
在未使用的结构体上添加 #[allow(dead_code)] 属性:
bash
# 使用 perl 或 sed 修改源代码
perl -i -pe 's/^pub struct Osc8Links;/#[allow(dead_code)]\n$&/' pulldown-cmark-mdcat/src/terminal/osc.rs
修改前:
rust
pub struct Osc8Links;
修改后:
rust
#[allow(dead_code)]
pub struct Osc8Links;
文件恢复
构建完成后,恢复原始文件:
bash
# 恢复原始文件
mv pulldown-cmark-mdcat/src/terminal/osc.rs.bak pulldown-cmark-mdcat/src/terminal/osc.rs 2>/dev/null || true
HNP 包配置
hnp.json
json
{
"type":"hnp-config",
"name":"mdcat",
"version":"1.0.0",
"install":{}
}
这是一个简单的 HNP 包配置,定义了包的基本信息。
安装目录结构
mdcat_1.0.0/
├── usr/
│ ├── bin/
│ │ └── mdcat # 可执行文件
│ └── share/
│ └── man/
│ └── man1/
│ └── mdcat.1 # 用户手册(如果可用)
└── hnp.json # HNP 包配置
构建结果
构建成功后,会生成以下文件:
-
HNP 包 :
mdcat.org_mdcat_1.0.0.hnp- HarmonyOS 原生包格式
- 可以直接安装到 HarmonyOS 设备
-
Tar 归档 :
ohos_mdcat_1.0.0.tar.gz- 压缩的 tar 归档
- 包含完整的安装目录结构
构建输出示例
==========================================
Build completed successfully!
==========================================
HNP Package: /path/to/archive/mdcat.org_mdcat_1.0.0.hnp
Tar Archive: /path/to/archive/ohos_mdcat_1.0.0.tar.gz
Installation Path: /path/to/data/service/hnp/mdcat.org/mdcat_1.0.0
==========================================
使用示例
在 HarmonyOS 上使用 mdcat
安装 HNP 包后,可以在 HarmonyOS 设备上使用 mdcat:
bash
# 显示 Markdown 文件
mdcat README.md
# 显示多个文件
mdcat file1.md file2.md
# 从标准输入读取
cat README.md | mdcat
# 禁用分页
mdcat --no-pager README.md
# 禁用颜色
mdcat --no-colour README.md
实际应用场景
-
查看项目文档:
bash# 查看 README mdcat README.md # 查看文档目录 mdcat docs/*.md -
代码文档查看:
bash# 查看代码注释文档 mdcat src/main.rs.md -
表格数据查看:
bash# 查看表格数据 mdcat data.md -
脚本集成:
bash# 在脚本中使用 mdcat --no-pager README.md | grep "关键词"
总结
适配要点
- 构建系统转换:从 Makefile 转向 Cargo,需要理解 Rust 的构建系统
- 链接器配置:创建链接器包装脚本,过滤不支持的选项
- 兼容层实现 :提供
__fd_chk函数的兼容实现 - 依赖库处理:禁用 curl 的 HTTPS 支持,避免 OpenSSL 依赖
- 源代码修改:修复 dead_code 警告问题
关键决策
- 创建兼容层 :提供
__fd_chk函数的实现,解决符号缺失问题 - 禁用 HTTPS:禁用 curl 的默认 features,避免 OpenSSL 依赖
- 链接器包装:创建包装脚本,过滤不支持的链接器选项
- 源代码修改:动态修改源代码,修复编译警告
优势
- 单二进制文件:mdcat 编译后是单个可执行文件,部署简单
- 高性能:Rust 编写,运行速度快
- 功能完整:支持 Markdown 渲染、语法高亮、表格格式化等功能
- 终端优化:针对终端显示优化输出
适用场景
- 查看 Markdown 文档
- 代码文档查看
- 表格数据查看
- 脚本集成
FAQ
Q1: 为什么选择 aarch64-unknown-linux-musl 作为目标平台?
A: HarmonyOS 使用 musl libc 而不是 glibc,因此选择 musl 变体。架构是 aarch64(ARM64),这是 HarmonyOS 的主要架构。
Q2: 为什么需要创建兼容层库?
A: HarmonyOS 的 musl libc 可能没有提供 __fd_chk 函数,而 curl-sys 需要这个函数。创建兼容层库可以提供这个函数的实现。
Q3: 禁用 curl 的 HTTPS 支持会影响功能吗?
A: 禁用 HTTPS 支持后,mdcat 将无法访问 HTTPS 远程资源,但仍支持本地文件和 HTTP 资源。对于大多数使用场景,这已经足够。
Q4: 如何验证构建的二进制文件?
A: 可以使用 file 命令检查:
bash
file target/aarch64-unknown-linux-musl/release/mdcat
应该显示类似:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), ...
Q5: 构建失败怎么办?
A: 检查以下几点:
- Rust 工具链是否正确安装
- 交叉编译目标是否已添加:
rustup target add aarch64-unknown-linux-musl - HarmonyOS SDK 路径是否正确
- 环境变量是否正确设置
- 兼容层库是否成功创建
Q6: 可以在其他架构上构建吗?
A: 当前配置针对 aarch64 架构。如果需要支持其他架构(如 x86_64),需要修改目标平台和相应的工具链配置。
Q7: 如何恢复修改的文件?
A: 构建脚本会在构建完成后自动恢复修改的文件(Cargo.toml 和 osc.rs)。如果构建失败,也会在退出前恢复。
Q8: 兼容层库是必需的吗?
A: 是的,如果没有兼容层库,链接器会报告 __fd_chk 符号缺失的错误。兼容层库提供了这个函数的实现,解决了链接问题。
相关链接
- mdcat 官方网站:https://github.com/lunaryorn/mdcat
- mdcat GitHub 仓库:https://github.com/lunaryorn/mdcat
- HarmonyOS 适配仓库:https://gitcode.com/nutpi/mdcat
- Rust 交叉编译文档:https://rust-lang.github.io/rustup/cross-compilation.html
- Cargo 配置文档:https://doc.rust-lang.org/cargo/reference/config.html
- HarmonyOS 开发者文档:https://developer.harmonyos.com/
- PC代码仓
- PC社区