Multisim仿真实战:C类与D类射频功率放大器效率对比与设计要点
2026/6/5 21:27:07
在 macOS 系统上编译 OpenHarmony PC 命令行 项目时,运行构建脚本build.sh遇到了以下错误:
cp: the -R and -r options may not be specified together这个错误导致后续的构建流程无法正常进行,需要定位并解决问题。
$ ./build.sh tree Build OS DarwinOHOS_SDK=/Users/jianguo/Library/OpenHarmony/Sdk/20CLANG_VERSION=15.0.4 x toolchain/ x toolchain/arm-linux-ohos-clang++ x toolchain/aarch64-linux-ohos-clang++ x toolchain/x86_64-linux-ohos-clang x toolchain/aarch64-linux-ohos-clang x toolchain/x86_64-linux-ohos-clang++ x toolchain/arm-linux-ohos-clang cp: the -R and -r options may not be specified together通过分析构建脚本build.sh,找到了问题所在的代码段:
then tar xvf Buildtools/toolchain.tar.gz cp -rfa toolchain/* $OHOS_SDK/native/llvm/bin rm -rf toolchain fi问题出现在第 99 行的cp -rfa命令。
在 macOS (BSD) 系统上,cp命令的参数行为与 Linux (GNU) 有所不同:
# GNU cp 允许多个相同功能的参数,最后一个生效cp-r -Rsourcedest# 正常工作,没有错误cp-rfasourcedest# 正常工作# BSD cp 严格检查参数冲突cp-r -Rsourcedest# 错误:-r 和 -R 不能同时使用cp-rfasourcedest# 错误:因为 -a 包含了 -R-a参数的含义在不同系统上,-a参数的定义:
Linux (GNU cp):
-a, --archive 等同于 -dR --preserve=all 包含以下功能: - -d: 保留链接 - -R: 递归复制目录 - --preserve=all: 保留所有文件属性macOS (BSD cp):
-a 等同于 -RpP 包含以下功能: - -R: 递归复制目录 - -p: 保留文件属性(修改时间、访问权限等) - -P: 不跟随符号链接在命令cp -rfa toolchain/* $OHOS_SDK/native/llvm/bin中:
-r: 递归复制目录-f: 强制复制,不提示-a: 归档模式(在 macOS 上等同于-RpP)冲突点:-a已经包含了-R(递归),而-r和-R是同一个功能的两种写法,在 macOS 的 BSD cp 实现中被视为参数冲突。
-a参数(推荐)既然-a已经包含了递归复制和属性保留功能,只需要去掉冗余的-r参数:
# 修改前 ❌cp-rfa toolchain/*$OHOS_SDK/native/llvm/bin# 修改后 ✅cp-a toolchain/*$OHOS_SDK/native/llvm/bin优点:
如果需要更细粒度的控制,可以分开指定参数:
# 递归复制 + 保留属性 + 强制覆盖cp-Rpf toolchain/*$OHOS_SDK/native/llvm/bin对于更复杂的文件同步需求:
rsync-a --force toolchain/$OHOS_SDK/native/llvm/bin/preparetoolchain(){if["$osname"!="HarmonyOS"]then# 检查工具链,不存在则解压工具链if[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang]||[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang++]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang++]||[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang.cmd]||[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang++.cmd]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang.cmd]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang++.cmd]thentarxvf Buildtools/toolchain.tar.gzcp-rfa toolchain/*$OHOS_SDK/native/llvm/bin# ❌ 问题行rm-rf toolchainfifi}preparetoolchain(){if["$osname"!="HarmonyOS"]then# 检查工具链,不存在则解压工具链if[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang]||[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang++]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang++]||[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang.cmd]||[!-f$OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang++.cmd]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang.cmd]||[!-f$OHOS_SDK/native/llvm/bin/arm-linux-ohos-clang++.cmd]thentarxvf Buildtools/toolchain.tar.gzcp-a toolchain/*$OHOS_SDK/native/llvm/bin# ✅ 修复后rm-rf toolchainfifi}修复后重新运行构建脚本:
$cdlycium $ ./build.sh tree Build OS DarwinOHOS_SDK=/Users/jianguo/Library/OpenHarmony/Sdk/20CLANG_VERSION=15.0.4 x toolchain/ x toolchain/arm-linux-ohos-clang++ x toolchain/aarch64-linux-ohos-clang++ x toolchain/x86_64-linux-ohos-clang x toolchain/aarch64-linux-ohos-clang x toolchain/x86_64-linux-ohos-clang++ x toolchain/arm-linux-ohos-clang# 没有错误,继续正常执行✅ 问题已解决,工具链文件成功复制。
| 参数 | macOS (BSD) | Linux (GNU) | 说明 |
|---|---|---|---|
-r | 递归复制 | 递归复制 | 复制目录及其内容 |
-R | 递归复制 | 递归复制 | 与 -r 相同 |
-a | 等于 -RpP | 等于 -dR --preserve=all | 归档模式 |
-p | 保留属性 | 保留属性 | 保留时间戳、权限等 |
-f | 强制覆盖 | 强制覆盖 | 不提示确认 |
-i | 交互模式 | 交互模式 | 覆盖前询问 |
-v | 详细输出 | 详细输出 | 显示复制的文件 |
# 推荐 ✅cp-a source_dir/ dest_dir/# 或者cp-R source_dir/ dest_dir/cp-av source_dir/ dest_dir/cp-af source_dir/ dest_dir/cp-ai source_dir/ dest_dir/# Linux (GNU cp)cp-au source_dir/ dest_dir/# macOS 需要使用 rsyncrsync-au source_dir/ dest_dir/# ❌ 参数冗余或冲突cp-r -Rsourcedest# -r 和 -R 重复cp-rfasourcedest# macOS 上 -r 和 -a 冲突cp-R -asourcedest# 参数重复# ✅ 正确写法cp-asourcedest# 简洁且功能完整cp-Rsourcedest# 只递归复制cp-Rfsourcedest# 递归 + 强制| 特性 | Linux (GNU) | macOS (BSD) |
|---|---|---|
| cp 实现 | GNU coreutils | BSD utilities |
| 参数检查 | 宽松,允许重复 | 严格,检查冲突 |
-a定义 | -dR --preserve=all | -RpP |
| 长参数支持 | 支持--archive | 不支持长参数 |
| 错误处理 | 较为宽松 | 较为严格 |
在编写需要跨平台运行的脚本时:
1. 优先使用简洁参数
# ✅ 跨平台兼容cp-asourcedest# ❌ 可能在某些平台出问题cp-rfasourcedest2. 检测系统类型
if[["$OSTYPE"=="darwin"*]];then# macOScp-asourcedestelif[["$OSTYPE"=="linux-gnu"*]];then# Linuxcp-asourcedestfi3. 使用 rsync 代替 cp(高级需求)
# rsync 在各平台表现一致rsync-a source/ dest/cp: cannot create regularfile'dest':Permission denied解决方案:
# 方法 1:修改目标目录权限chmodu+w dest_dir# 方法 2:使用 sudosudocp-asourcedest# 方法 3:修改所有权sudochown-R$USERdest_dircp: error writing'dest':No space left on device解决方案:
# 检查磁盘空间df-h# 清理不需要的文件# macOSdu-sh *|sort-rh|head-10# 清理系统缓存sudorm-rf /Library/Caches/*# 复制时符号链接变成普通文件解决方案:
# 保留符号链接cp-asourcedest# -a 包含 -P,不跟随链接cp-RPsourcedest# 明确指定# 复制后文件的时间戳、权限等属性改变解决方案:
# 使用 -p 或 -a 保留属性cp-psourcedest# 保留基本属性cp-asourcedest# 保留所有属性(推荐)在 macOS 系统上,cp -rfa命令会导致参数冲突错误,因为:
-a参数已经包含了-R(递归)功能-r和-a相当于同时使用了-r和-R将cp -rfa修改为cp -a,去掉冗余的-r参数。
-a参数:最简洁且功能完整的归档复制方式-r、-R和-a本文的解决方案适用于:
| 参数 | BSD (macOS) | GNU (Linux) | 说明 |
|---|---|---|---|
-a | ✅ | ✅ | 归档模式,保留所有属性 |
-f | ✅ | ✅ | 强制复制,不提示 |
-i | ✅ | ✅ | 交互模式,提示确认 |
-n | ✅ | ✅ | 不覆盖已存在的文件 |
-p | ✅ | ✅ | 保留文件属性 |
-r/-R | ✅ | ✅ | 递归复制目录 |
-v | ✅ | ✅ | 详细输出模式 |
-L | ✅ | ✅ | 跟随符号链接 |
-P | ✅ | ✅ | 不跟随符号链接 |
-u | ❌ | ✅ | 只复制更新的文件 |
--archive | ❌ | ✅ | 等同于 -a |
--preserve | ❌ | ✅ | 精确指定保留的属性 |