win11 环境下 Ubuntu 22.04.5 仓颉编程语言初体验:环境安装与 Hello World 全记录
注: 官网给的链接wget超长无法下载,我用atomgit仓库做了个中转,解决下SDK的下载问题。
本文记录了在 Linux(x86_64)上从零安装仓颉(Cangjie)编程语言 SDK、配置开发环境,并成功编译运行第一个
hello.cj程序的完整过程,包含踩过的坑和解决方案,供同样想尝试仓颉的朋友参考。


目录
一、仓颉语言是什么
仓颉(Cangjie)是华为推出的一门面向全场景应用开发的编程语言,主打多范式(面向对象、函数式、命令式等)、高性能、原生并发、原生可扩展等特性,编译产物可运行于多种硬件平台(如 x86_64、ARM 等),并支持与 C/C++ 等语言互操作。仓颉 1.0 版本已正式开源发布,开发者可以在官方社区(cangjie-lang.cn)获取 SDK、文档与交流资源。
二、下载 SDK
仓颉 SDK 的官方发布渠道之一是 Git 仓库,通过 Git LFS(Large File Storage)托管体积较大的二进制压缩包。
在 Linux 终端中克隆 SDK 仓库:
git clone https://gitcode.com/feng8403000/cangjie-sdk-linux-x64-1.0.5.tar.gz.git
克隆完成后,目录里会有一个 cangjie-sdk-linux-x64-1.0.5.tar.gz 文件。注意:这个文件可能只是一个 Git LFS 指针文件,而不是真正的压缩包。
可以用 file 命令验证:
file cangjie-sdk-linux-x64-1.0.5.tar.gz
# 输出: ASCII text —— 说明这是 LFS 指针,不是真实压缩包
指针文件的内容大致如下:
version https://git-lfs.github.com/spec/v1
oid sha256:bacad84df8e0281c5395bab4c40e481e3ea6cc712eed5c953903b0d561a14562
size 281715855
它记录的是真实文件(约 281 MB)的 SHA-256 校验值和大小。需要通过 git lfs pull 把真实内容拉取下来。
三、解决 Git LFS 无法拉取的问题
3.1 系统没有安装 git-lfs
直接执行 git lfs pull 会报错:
fatal: 'lfs' appears to be a git command, but we were not
able to execute it. Maybe git-lfs is broken?
说明系统缺少 git-lfs 工具。由于当前用户没有 apt 的 root 权限,无法用 sudo apt-get install git-lfs 安装,改为下载官方二进制包手动安装:
curl -sL "https://github.com/git-lfs/git-lfs/releases/download/v3.5.1/git-lfs-linux-amd64-v3.5.1.tar.gz" -o /tmp/git-lfs.tar.gz
tar -xzf /tmp/git-lfs.tar.gz -C /tmp
sudo cp /tmp/git-lfs-3.5.1/git-lfs /usr/local/bin/
sudo /usr/local/bin/git-lfs install --skip-repo
验证安装:
git lfs version
# 输出: git-lfs/3.5.1 (GitHub; linux amd64; go 1.21.7; git e237bb3a)
小提示:如果
git clone时报 “detected dubious ownership”(仓库目录所有权问题),先执行:git config --global --add safe.directory /你的仓库路径
3.2 git lfs pull 反复超时 / 断连
尝试 git lfs pull 时下载非常慢甚至超时(文件有 281 MB)。网络环境不佳时,更稳妥的做法是绕过 git 直接调用 LFS 的 HTTP 批量接口获取带签名的直链,再用 curl 断点续传。
第一步,查询 LFS 对象获取下载直链:
curl -s -X POST "https://gitcode.com/feng8403000/cangjie-sdk-linux-x64-1.0.5.tar.gz.git/info/lfs/objects/batch" \
-H "Accept: application/vnd.git-lfs+json" \
-H "Content-Type: application/vnd.git-lfs+json" \
-d '{"operation":"download","transfers":["basic"],"objects":[{"oid":"bacad84df8e0281c5395bab4c40e481e3ea6cc712eed5c953903b0d561a14562","size":281715855}]}'
注意:Content-Type 必须是 application/vnd.git-lfs+json,否则接口会拒绝。
接口会返回类似下面的 JSON,其中 actions.download.href 就是带时效签名的直链:
{
"transfer": "basic",
"objects": [
{
"oid": "bacad84df8e0281c5395bab4c40e481e3ea6cc712eed5c953903b0d561a14562",
"size": 281715855,
"actions": {
"download": {
"href": "https://lfs-cdn.gitcode.com/lfs-objects/ba/ca/...?auth_key=...",
"expires_in": 600
}
}
}
]
}
第二步,用 curl 断点续传下载(-C - 支持断点续传;签名链接有效期约 10 分钟,超时后重新获取即可):
curl -L -C - -o cangjie-sdk-linux-x64-1.0.5.tar.gz "https://lfs-cdn.gitcode.com/lfs-objects/ba/ca/...?auth_key=..."
下载过程中由于网络不稳会偶发 SSL 断连(OpenSSL SSL_read: unexpected eof、Connection reset by peer 等),此时文件已下载的部分会保留,重新获取一个新的签名直链,再次执行上面的 curl 即可从断点继续,直到文件大小达到 281715855 字节。
第三步,校验文件完整性(与指针文件中的 oid 比对):
echo "bacad84df8e0281c5395bab4c40e481e3ea6cc712eed5c953903b0d561a14562 cangjie-sdk-linux-x64-1.0.5.tar.gz" | sha256sum -c -
# 输出: OK —— 文件完整
四、解压 SDK
tar -xzf cangjie-sdk-linux-x64-1.0.5.tar.gz
解压后得到 cangjie/ 目录,核心结构如下:
cangjie/
├── bin/ # 编译器可执行文件(cjc、cjc-frontend)
├── lib/ # 标准库静态/动态库
├── modules/ # 标准库模块(llvm bitcode)
├── runtime/ # 运行时库
├── tools/ # 配套工具(如 cjpm 包管理器)
└── envsetup.sh # 官方环境配置脚本(关键!)
五、配置环境变量
SDK 自带的 envsetup.sh 脚本会帮我们设置好所有必要的环境变量,包括:
CANGJIE_HOME:指向 SDK 根目录PATH:加入$CANGJIE_HOME/bin(cjc 编译器所在目录)等LD_LIBRARY_PATH:加入运行时库路径
脚本内容核心部分:
export CANGJIE_HOME=${script_dir}
export PATH=${CANGJIE_HOME}/bin:${CANGJIE_HOME}/tools/bin:$PATH:${HOME}/.cjpm/bin
export LD_LIBRARY_PATH=${CANGJIE_HOME}/runtime/lib/linux_${hw_arch}_cjnative:${CANGJIE_HOME}/tools/lib:${LD_LIBRARY_PATH}
为了让每次打开新终端都自动生效,在 ~/.bashrc 末尾追加:
# Cangjie SDK environment
source /opt/cangjie/cangjieSDK/cangjie/envsetup.sh
注意:
envsetup.sh必须用source(而不是直接执行),因为它需要在当前 shell 中设置环境变量。
配置完成后,验证环境是否生效:
source /opt/cangjie/cangjieSDK/cangjie/envsetup.sh
echo $CANGJIE_HOME # /opt/cangjie/cangjieSDK/cangjie
which cjc # /opt/cangjie/cangjieSDK/cangjie/bin/cjc
cjc --version
cjc --version 输出示例:
Cangjie Compiler: 1.0.5 (cjnative)
Target: x86_64-unknown-linux-gnu
环境配置成功!✅
六、编写 hello.cj
在工作目录下创建 hello.cj 文件,写入仓颉版的 Hello World:
main() {
println("Hello, Cangjie!")
}
说明:与 C/C++ 类似,
main是程序入口;println是仓颉标准库提供的控制台输出函数。
七、编译并运行
编译:
cjc hello.cj -o hello
生成可执行文件 hello,运行它:
./hello
# 输出: Hello, Cangjie!
也可以一步到位:
cjc -run hello.cj
看到终端输出的 Hello, Cangjie!,恭喜,你的第一个仓颉程序跑起来了!🎉
八、遇到的问题与解决
| 问题 | 现象 | 解决方案 |
|---|---|---|
| git lfs 命令不存在 | fatal: 'lfs' appears to be a git command... |
下载 git-lfs 官方二进制包并安装到 /usr/local/bin |
| 仓库目录所有权报错 | detected dubious ownership in repository |
git config --global --add safe.directory <仓库路径> |
| LFS 下载超时/断连 | curl: (56) OpenSSL SSL_read... |
调用 LFS HTTP 批量接口获取直链,用 curl -C - 断点续传,反复续传直到完整 |
| 无法写入源码文件 | write_file: Permission denied |
目录归 root 所有,用 sudo chown 调整目录/文件属主 |
| 编译报错权限拒绝 | error: Permission denied: '.' |
cjc 需要在当前目录写中间产物,确保当前目录有写权限 |
| 环境变量未生效 | cjc: command not found |
必须 source envsetup.sh,并把它加进 ~/.bashrc |
九、总结
- 仓颉 SDK 的下载链路有些特殊(Git LFS 托管大文件),网络不好时用直链 + 断点续传是最可靠的方式;
- 官方
envsetup.sh一键搞定环境变量,只需要source进 shell 配置即可; - 仓颉的编译模型和 C 系语言很接近,
cjc编译 + 运行可执行文件,上手非常快; - 常用命令速查:
source /opt/cangjie/cangjieSDK/cangjie/envsetup.sh # 加载环境(或直接新开终端)
cjc hello.cj -o hello # 编译
./hello # 运行
cjc -run hello.cj # 编译并运行一步到位
下一步可以尝试:用 cjpm 创建正式工程、探索标准库、体验仓颉的并发特性。祝编码愉快!
本文基于仓颉 SDK 1.0.5(Linux x86_64)实测记录,命令均在 Ubuntu系环境验证通过。
更多推荐



所有评论(0)