注: 官网给的链接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 eofConnection 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

九、总结

  1. 仓颉 SDK 的下载链路有些特殊(Git LFS 托管大文件),网络不好时用直链 + 断点续传是最可靠的方式;
  2. 官方 envsetup.sh 一键搞定环境变量,只需要 source 进 shell 配置即可;
  3. 仓颉的编译模型和 C 系语言很接近,cjc 编译 + 运行可执行文件,上手非常快;
  4. 常用命令速查:
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系环境验证通过。

Logo

一站式 AI 云服务平台

更多推荐