资讯动态

cangjie_build 实战:在 Linux 上交叉构建完整的 linux-x64-android 仓颉 SDK

发布时间:2026/10/13 10:06:12 来源:尧图企业网站定制
文档教程构建工具【免费下载链接】cangjie_build仓颉SDK集成构建指导书。项目地址https://gitcode.com/Cangjie/cangjie_build点击查看免费下载本文基于 cangjie_build 仓库中的 Linux → Android 交叉构建指导书doc_en/linux_android.md面向 Ubuntu 22.04 环境完整演示如何搭建仓颉 SDK 构建环境并依次构建编译器、运行时、标准库、STDX 扩展库与全部工具链最终打包出包含全部组件的linux-x64-android仓颉 SDK并通过编译运行 Hello, Cangjie 程序验证构建成果。读完后你将能够独立完成一次“从裸机依赖到可分发 SDK 包”的完整仓颉交叉构建。一、构建概述流程全景与关键注意事项1.1 构建流程全景图整个构建过程分为五个阶段准备阶段准备环境、编译核心依赖、创建工作区、源码获取与核心编译阶段获取仓颉源码、编译编译器和调试器、编译运行时、库编译阶段编译标准库、编译 STDX 扩展库、工具集编译阶段cjpm、cjfmt、cjlint、cjcov、cjtrace-recover、hle、lspserver、cjprof、cjcompat、互操作库、打包和验证组织并打包文件、编译 Hello, Cangjie 程序。1.2 关键注意事项注意事项说明静态编译可选cjdb依赖于libedit和 ncurses。若要保证生成的 SDK 在满足“glibc 版本 ≥ 编译环境版本”且“Linux Kernel 版本与编译环境一致”的 Linux 发行版中稳定运行需要从源码编译静态版本的libedit和ncurses环境隔离所有自定义依赖统一安装在/opt/buildtools避免污染系统路径内存要求完整构建需要 ≥8GB 内存建议额外添加 4GB 交换空间Android NDK 工具链本文以 Android NDK r26d 为例支持 Android 26网络要求首次构建需下载约 3GB 数据请确保稳定的网络连接芯片指令集x86_64从 cangjie_build 仓库的整体文档结构看README_zh.md本指导书对应“Linux - Android 交叉构建指导”构建产物linux-x64-androidSDK 包含两部分可执行代码——在 Linux x86_64 宿主机上运行的原生组件编译器cjc、调试器cjdb、各工具链以及面向aarch64-linux-android目标平台的交叉组件编译器 Android 版、运行时 Android 版、标准库 Android 版、STDX 扩展库。这也是后续所有构建命令中反复出现android26-aarch64/aarch64-linux-android26目标参数的原因。各组件对构建工具的版本要求可对照仓库内的 构建依赖工具文档英文版本见 doc_en/env.mdLinux 环境下的核心约束为python 3.7、LLVM 15.0.4 且 16、binutils 2.38、gcc 7.3.0、cmake 3.16.5 且 4、ninja 1.10、googletest 1.12cjc与cjtrace-recover需要、OpenSSL 3标准库std与stdx需要、swig 4cjdb需要。这也解释了下文系统工具安装命令中为什么同时引入clang clang-15 libclang-15-devLLVM 15 工具链、libssl-devOpenSSL 3和swig。二、环境准备2.1 系统要求操作系统以 Ubuntu 22.04 LTS 作为示例其他版本也可以参考本文流程磁盘空间≥50GB内存≥8GB物理内存 交换空间用户权限普通用户 sudo 权限你也可以选择基于官方提供的 Docker 环境进行构建该镜像为 Ubuntu 18.04已预装所有构建仓颉所需的系统工具和构建工具docker pull swr.cn-north-4.myhuaweicloud.com/cj-docker/cangjie_ubuntu18_x86_kernel:v2.9需要注意的前提限制指导书基于 Ubuntu 22.04 等较高操作系统版本构建构建出来的 SDK 只能在对应系统上运行如果目标是在更低版本系统上运行 SDK则需要到低版本系统上构建构建步骤和复杂度会相应提升更多依赖工具需要基于源码构建。2.2 安装系统工具1使用华为镜像源可选在国内网络环境下可以先将 apt 源替换为华为云镜像再更新索引# 1.备份配置文件 sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak; # 2.修改sources.list文件将http://archive.ubuntu.com和http://security.ubuntu.com替换成http://mirrors.huaweicloud.com可以参考如下命令 sudo sed -i shttp://.*archive.ubuntu.comhttp://mirrors.huaweicloud.comg /etc/apt/sources.list; sudo sed -i shttp://.*security.ubuntu.comhttp://mirrors.huaweicloud.comg /etc/apt/sources.list; # 3.更新索引 sudo apt-get update;2安装系统工具一次性安装构建所需的全部系统依赖sudo apt update sudo apt install -y \ tar unzip wget curl libcurl4 expat openssl make gcc g gettext \ nfs-common libtool sqlite3 zlib1g-dev libssl-dev cmake ninja-build\ libcurl4-openssl-dev sudo autoconf build-essential rapidjson-dev \ texinfo binutils expat libelf-dev libdwarf-dev openssh-client ssh \ dos2unix libxext-dev libxtst-dev libxt-dev libcups2-dev clang clang-15 libedit-dev\ libxrender-dev zip bzip2 libopenmpi-dev vim gdb lldb libclang-15-dev libgtest-dev\ rpm patch libtinfo5 cpio rpm2cpio libncurses5 libncurses5-dev strace net-tools swig openjdk-21-jdk;从依赖清单的构成可以看出各组件的底层需求cmake ninja-build make gcc g是编译器、运行时与各 C/Python 工具构建的基础clang clang-15 libclang-15-dev提供 LLVM 15 工具链与 libclang 头文件/库cjfmt、cjlint等代码类工具需要libssl-dev openssl满足标准库对 OpenSSL 3 的依赖libedit-dev libncurses5-dev是调试器cjdb的终端行编辑与界面依赖swig用于cjdb的接口绑定libgtest-dev对应 googletest 1.12 的测试依赖openjdk-21-jdk则是后续 Java Interop 构建的 JDK 环境。2.3 编译静态库可选libedit和 ncurses 库并非必须源码编译也可以使用系统预编译版本只有当你需要生成的 SDK 在 glibc / 内核版本与编译环境匹配的其他发行版上稳定运行cjdb时才需要按本节编译静态版本。准备工作建立统一构建工具目录并获取 CPU 核数用于并行编译# 构建工具目录 export BUILD_ROOT/opt/buildtools; sudo mkdir -p $BUILD_ROOT; sudo chown $USER:$USER $BUILD_ROOT; tmp_cpus$(grep -w processor /proc/cpuinfo|wc -l);1编译 ncurses 6.5静态cd $BUILD_ROOT; git clone https://gitcode.com/openharmony/third_party_ncurses.git -b OpenHarmony-v6.0-Release ncurses-6.5; cd ncurses-6.5; ./configure --with-termlib CCclang CXXclang CFLAGS-fPIC CPPFLAGS-fPIC CFLAGS-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack CXXFLAGS-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack --with-terminfo-dirs/etc/terminfo:/lib/terminfo:/usr/share/terminfo --disable-widec --disable-overwrite --disable-root-environ; make -j ${tmp_cpus}; make install DESTDIR${BUILD_ROOT}/ncurses-6.5;几个关键参数说明--with-termlib将 term 相关功能并入主库CFLAGS-fPIC保证目标代码为位置无关代码-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack为栈保护与链接加固选项--with-terminfo-dirs指定三个常用 terminfo 搜索路径确保目标机器上不同布局的终端数据库都能被找到--disable-widec关闭宽字符cursesw独立库以减小体积DESTDIR${BUILD_ROOT}/ncurses-6.5使安装结果落在构建工具目录下而非系统目录与“环境隔离”原则一致。2编译 libedit 3.1静态cd $BUILD_ROOT; git clone https://gitcode.com/openharmony/third_party_libedit.git -b OpenHarmony-5.0.0-Release; cd third_party_libedit tar xf libedit-20210910-3.1.tar.gz; cd libedit-20210910-3.1; ./configure --with-pic --enable-sharedno --prefix${BUILD_ROOT}/libedit-3.1; make -j ${tmp_cpus}; make install;其中--enable-sharedno表示只生成静态库与--with-pic配合静态库仍可被动态链接的cjdb引用--prefix${BUILD_ROOT}/libedit-3.1控制安装前缀。编译产物路径libedit-3.1和ncurses-6.5/usr将在第 4.1 节通过CMAKE_PREFIX_PATH被编译器构建消费。2.4 安装 Android NDK r26d本步骤完成三件事下载并部署 Android NDK r26d、将其 binutils/clang 工具链加入 PATH、为 Android arm64 目标在 NDK sysroot 中构建一份 OpenSSL供 Android 版标准库链接使用。install_dir/opt/buildtools/android-ndk-r26d mkdir -p ${install_dir} tmp_cpus$(grep -w processor /proc/cpuinfo|wc -l) wget https://dl.google.com/android/repository/android-ndk-r26d-linux.zip -q --no-check-certificate; git clone https://gitcode.com/openharmony/third_party_openssl.git -b OpenHarmony-v6.0-Release openssl-3.0.9 unzip -qo android-ndk-r26d-linux.zip mv android-ndk-r26d/* ${install_dir} export PATH$install_dir/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH export ANDROID_NDK_ROOT${install_dir} mkdir -p ${install_dir}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local ls -l ${install_dir}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/ cd openssl-3.0.9 # configuring mkdir -p build cd build ../Configure android-arm64 -D__ANDROID_API__31 --prefix${install_dir}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local --with-zlib-include${install_dir}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include --with-zlib-lib${install_dir}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib # building make -j $tmp_cpus make install_sw参数要点ANDROID_NDK_ROOT指认 NDK 根目录后续编译器/运行时/标准库/STDX/Interop 构建都会通过它定位toolchains/llvm/prebuilt/linux-x86_64下的交叉工具链OpenSSL 采用android-arm64目标、-D__ANDROID_API__31最低 API 级别并将--prefix直接指向 NDK 的sysroot/usr/local——这样交叉编译 Android 版标准库时链接器天然能在 sysroot 内找到这套libssl/libcrypto--with-zlib-include/--with-zlib-lib指向 sysroot 内的 zlib 头文件与库保证 OpenSSL 自身对 zlib 的依赖在交叉环境下可解析make install_sw只安装软件产物库、头文件、工具不安装文档类文件。2.5 设置环境变量1OpenSSL 环境变量设置构建仓颉标准库依赖 OpenSSL 3。前面 2.2 节中已通过系统包安装 OpenSSL 库现在需要设置OPENSSL_PATH环境变量第一步定位 OpenSSL 的 lib 目录。库文件默认位于/usr/lib/x86_64-linux-gnu/x86_64 架构下验证方法# 查找libssl.so ls /usr/lib/x86_64-linux-gnu/libssl.so* # 查找libcrypto.so ls /usr/lib/x86_64-linux-gnu/libcrypto.so*第二步设置OPENSSL_PATH请将示例中的/path/to/openssl-3.x替换为你实际的 OpenSSL lib 目录export OPENSSL_PATH/path/to/openssl-3.x export LD_LIBRARY_PATH$OPENSSL_PATH:$LD_LIBRARY_PATH如果你使用的是官方 Docker 镜像可以直接使用如下设置# x86_64 export OPENSSL_PATH${BUILD_ROOT}/openssl-3.0.9/lib64;2其他环境变量设置在进行后续操作步骤前需要配置以下环境变量export PATH/usr/lib/llvm-15/bin:$PATH; # 用于将 clang-15 加入环境变量 export ANDROID_NDK_ROOT/opt/buildtools/android-ndk-r26d # 架构名 export ARCHx86_64 # 或aarch64 # Cangjie SDK 版本号 export CANGJIE_VERSION1.0.0 # Stdx版本号 export STDX_VERSION1 export SDK_NAMElinux-x64-android各变量用途ARCH决定宿主机侧运行时目录名如linux_x86_64_cjnative并用于 cjpm 的 rpath 设置CANGJIE_VERSION/STDX_VERSION贯穿各组件build.py build -v参数与最终打包文件名SDK_NAMElinux-x64-android是本 SDK 包的身份标识决定产物名cangjie-sdk-linux-x64-android-1.0.0.tar.gz。三、源码准备3.1 创建工作区请将/path/to/workspace替换为你的构建工作目录export WORKSPACE/path/to/workspace mkdir -p $WORKSPACE; cd $WORKSPACE;3.2 获取仓颉源码一次性克隆五个核心仓库均使用main分支git clone https://gitcode.com/Cangjie/cangjie_compiler.git -b main; git clone https://gitcode.com/Cangjie/cangjie_runtime.git -b main; git clone https://gitcode.com/Cangjie/cangjie_tools.git -b main; git clone https://gitcode.com/Cangjie/cangjie_stdx.git -b main; git clone https://gitcode.com/Cangjie/cangjie_multiplatform_interop.git -b main;五个仓库的分工与后续构建步骤一一对应cangjie_compiler编译器cjc 调试器cjdb其output目录是整个 SDK 的组装中心、cangjie_runtimeruntime/运行时与stdlib/标准库、cangjie_toolscjpm、cjfmt、cjlint、cjcov、cjtrace-recover、hyperlangExtension、cangjie-language-server、cjprof、cjcompat 共 9 个工具、cangjie_stdxSTDX 扩展库、cangjie_multiplatform_interopJava 互操作。四、编译流程4.1 编译仓颉编译器和调试器如果第 2.3 节编译了静态库可通过CMAKE_PREFIX_PATH与--target-lib让构建系统消费它们可选export CMAKE_PREFIX_PATH$BUILD_ROOT/libedit-3.1:$BUILD_ROOT/ncurses-6.5/usr;执行构建。这里共发起三次构建第一次构建宿主机 x86_64 版编译器与调试器第二次针对android26-aarch64目标交叉构建 Android 版编译器第三次安装cd $WORKSPACE/cangjie_compiler; python3 build.py clean; python3 build.py build -t release \ -v ${CANGJIE_VERSION} \ --no-tests \ --target-lib$BUILD_ROOT/ncurses-6.5/usr/lib \ --build-cjdb; python3 build.py build -t release \ --target android26-aarch64 \ --android-ndk ${ANDROID_NDK_ROOT}; python3 build.py install;参数要点-t release为发布版本-v ${CANGJIE_VERSION}注入 SDK 版本号--no-tests跳过测试构建以缩短耗时--build-cjdb追加构建调试器该组件依赖 libedit/ncurses 与 swig--target-lib指定静态 ncurses 库路径--target android26-aarch64表示目标平台为 Android 26 的 aarch64--android-ndk指定 NDK 根目录供交叉工具链使用。验证安装source output/envsetup.sh; cjc -v;source output/envsetup.sh会把 SDK 组装目录下的 bin 等路径写入当前 shell 环境随后cjc -v应输出版本信息。4.2 编译仓颉运行时运行时同样需要构建两个目标宿主机 x86_64 版与 Android aarch64 版并把产物汇入编译器output目录cd $WORKSPACE/cangjie_runtime/runtime; python3 build.py clean; python3 build.py build -t release -v ${CANGJIE_VERSION}; python3 build.py install; python3 build.py build -t release \ --target android26-aarch64 \ --target-toolchain ${ANDROID_NDK_ROOT}/toolchains \ -v ${CANGJIE_VERSION}; python3 build.py install; cp -R output/common/linux_release_x86_64/{lib,runtime} ${WORKSPACE}/cangjie_compiler/output; cp -R output/common/linux_android_release_aarch64/{lib,runtime} ${WORKSPACE}/cangjie_compiler/output;说明Android 目标通过--target-toolchain直接指向 NDK 的toolchains目录编译器构建用的是--android-ndk此处是运行时 build.py 对应的等价传参方式。最后的两条cp -R将output/common/linux_release_x86_64与output/common/linux_android_release_aarch64下的lib、runtime目录复制进cangjie_compiler/output使 SDK 组装目录同时包含两侧运行时的lib与runtime子树。4.3 编译仓颉标准库标准库依赖运行时头文件与 OpenSSL同样构建宿主机与 Android 两个目标cd $WORKSPACE/cangjie_runtime/stdlib; python3 build.py clean; python3 build.py build -t release \ --target-lib$WORKSPACE/cangjie_runtime/runtime/output \ --target-lib$OPENSSL_PATH; python3 build.py build -t release\ --target android26-aarch64 \ --target-lib${WORKSPACE}/cangjie_runtime/runtime/output \ --target-toolchain ${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin python3 build.py install; cp -R $WORKSPACE/cangjie_runtime/stdlib/output/* ${WORKSPACE}/cangjie_compiler/output/;参数要点--target-lib可重复出现这里分别指向运行时产物目录标准库链接运行时接口与 2.5 节设置的OPENSSL_PATH标准库的加解密等能力依赖 OpenSSL 3Android 目标额外通过--target-toolchain指定 NDK 的 bin 目录。最后的cp -R将标准库产物并入 SDK 组装目录。注意Android 版标准库的 OpenSSL 来自 2.4 节在 NDK sysroot 内构建的sysroot/usr/local交叉链接时由 sysroot 机制自动解析因此这里无需再显式传 OpenSSL 路径。4.4 编译 STDX 扩展库STDX 扩展库面向 Android aarch64 目标构建构建产物将单独打包分发cd ${WORKSPACE}/cangjie_stdx; python3 build.py clean; python3 build.py build -t release \ --include${WORKSPACE}/cangjie_compiler/include \ --target-toolchain ${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin \ --target android26-aarch64; python3 build.py install; export CANGJIE_STDX_PATH${WORKSPACE}/cangjie_stdx/target/linux_android_aarch64_cjnative/static/stdx;其中--include指向编译器的 include 目录以便引用编译期接口--target android26-aarch64表示目标平台构建产物落在target/linux_android_aarch64_cjnative/下CANGJIE_STDX_PATH指认静态 stdx 目录供后续链接使用。4.5 编译工具集工具集包含 9 个命令行工具与 Java 互操作库统一组装进cangjie_compiler/output/tools/下的bin/lib/config三个子目录。各工具的定位与产物去向一览工具源码目录主要产物去向SDK 组装目录内cjpm包管理cangjie_tools/cjpmtools/bin/cjpmtools/config/*.tomlcjfmt格式化cangjie_tools/cjfmttools/bin/cjfmttools/config/*.tomlcjlint静态检查cangjie_tools/cjlinttools/bin/cjlinttools/lib/*tools/config/*cjcov覆盖率cangjie_tools/cjcovtools/bin/cjcovcjtrace-recovertrace 恢复cangjie_tools/cjtrace-recovertools/下install --prefix安装hleHyperLangExtensioncangjie_tools/hyperlangExtensiontools/bin/hletools/dtsparserlspserver语言服务cangjie_tools/cangjie-language-servertools/bin/LSPServercjprof性能剖析cangjie_tools/cjproftools/bin/cjproftools/lib/* 可选staticcjcompat兼容工具cangjie_tools/cjcompattools/bin/cjcompatJava Interop互操作cangjie_multiplatform_interop/javaoutput/根下双平台 interoplib1cjpmcd ${WORKSPACE}/cangjie_tools/cjpm/build; python3 build.py clean; python3 build.py build -t release --set-rpath \$ORIGIN/../../runtime/lib/linux_${ARCH}_cjnative; python3 build.py install; mkdir -p ${WORKSPACE}/cangjie_compiler/output/tools/config; cp ${WORKSPACE}/cangjie_tools/cjpm/dist/cjpm ${WORKSPACE}/cangjie_compiler/output/tools/bin; mv ${WORKSPACE}/cangjie_tools/cjpm/dist/*.toml ${WORKSPACE}/cangjie_compiler/output/tools/config;--set-rpath \$ORIGIN/../../runtime/lib/linux_${ARCH}_cjnative为 cjpm 二进制写入$ORIGIN相对 rpath使其运行时能定位到 SDK 内runtime/lib/linux_x86_64_cjnative下的仓颉运行时库dist/*.toml为 cjpm 的配置模板随工具一并纳入tools/config。2cjfmtcd ${WORKSPACE}/cangjie_tools/cjfmt/build; python3 build.py clean; python3 build.py build -t release; python3 build.py install; mv ${WORKSPACE}/cangjie_tools/cjfmt/build/build/bin/cjfmt ${WORKSPACE}/cangjie_compiler/output/tools/bin; mv ${WORKSPACE}/cangjie_tools/cjfmt/config/*.toml ${WORKSPACE}/cangjie_compiler/output/tools/config;3cjlintcd ${WORKSPACE}/cangjie_tools/cjlint/build; python3 build.py clean; python3 build.py build -t release; python3 build.py install; mv ${WORKSPACE}/cangjie_tools/cjlint/dist/bin/cjlint ${WORKSPACE}/cangjie_compiler/output/tools/bin mv ${WORKSPACE}/cangjie_tools/cjlint/dist/lib/* ${WORKSPACE}/cangjie_compiler/output/tools/lib mv ${WORKSPACE}/cangjie_tools/cjlint/dist/config/* ${WORKSPACE}/cangjie_compiler/output/tools/config4cjcovcd ${WORKSPACE}/cangjie_tools/cjcov/build; python3 build.py clean; python3 build.py build -t release; python3 build.py install; mv ${WORKSPACE}/cangjie_tools/cjcov/dist/cjcov ${WORKSPACE}/cangjie_compiler/output/tools/bin;5cjtrace-recovercd ${WORKSPACE}/cangjie_tools/cjtrace-recover/build; python3 build.py clean; python3 build.py build -t release; python3 build.py install --prefix ${WORKSPACE}/cangjie_compiler/output/tools;install --prefix直接把产物安装到 SDK 的 tools 目录无需手工拷贝。6HyperLangExtensionhlecd $WORKSPACE/cangjie_tools/hyperlangExtension/build; python3 build.py clean; python3 build.py build -t release; python3 build.py install; cp ${WORKSPACE}/cangjie_tools/hyperlangExtension/target/bin/main ${WORKSPACE}/cangjie_compiler/output/tools/bin/hle; cp -R ${WORKSPACE}/cangjie_tools/hyperlangExtension/src/dtsparser ${WORKSPACE}/cangjie_compiler/output/tools; rm -rf ${WORKSPACE}/cangjie_compiler/output/tools/dtsparser/*.cj;除主程序外还会把dtsparser解析器资源目录一并拷入并清除其中的.cj源文件只保留发布所需产物。7LSP Servercd $WORKSPACE/cangjie_tools/cangjie-language-server/build; python3 build.py clean; python3 build.py build -t release; python3 build.py install; cp ${WORKSPACE}/cangjie_tools/cangjie-language-server/output/bin/LSPServer ${WORKSPACE}/cangjie_compiler/output/tools/bin8cjprofcd ${WORKSPACE}/cangjie_tools/cjprof/build; python3 build.py build -t release; python3 build.py install; cp $WORKSPACE/cangjie_tools/cjprof/dist/bin/cjprof ${WORKSPACE}/cangjie_compiler/output/tools/bin cp $WORKSPACE/cangjie_tools/cjprof/dist/lib/* ${WORKSPACE}/cangjie_compiler/output/tools/lib if [[ -d $WORKSPACE/cangjie_tools/cjprof/static ]]; then cp -Rf $WORKSPACE/cangjie_tools/cjprof/static cangjie/tools/config; fi静态资源目录static存在时才拷入tools/config。9cjcompatcd ${WORKSPACE}/cangjie_tools/cjcompat/build; python3 build.py build -t release; python3 build.py install; cp $WORKSPACE/cangjie_tools/cjcompat/dist/bin/cjcompat ${WORKSPACE}/cangjie_compiler/output/tools/bin4.6 编译 Java 互操作库Java Interop 包含镜像生成器java-mirror-gen与互操作库 interoplib需要构建三个部分镜像生成器宿主机、interoplib 的 linux_x86_64 版与 aarch64-linux-android 版cd ${WORKSPACE}/cangjie_multiplatform_interop/java/build # java-mirror-gen python3 build.py clean; python3 build.py build; python3 build.py install --prefix ${WORKSPACE}/cangjie_compiler/output; # interoplib linux_x86_64 python3 build.py clean; python3 build.py build --target-lib linux_x86_64_cjnative; python3 build.py install --target linux_x86_64 --prefix ${WORKSPACE}/cangjie_compiler/output; # interoplib aarch64-linux-android export PATH${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH; source ${WORKSPACE}/cangjie_compiler/output/envsetup.sh; python3 build.py clean; python3 build.py build -t release \ --target aarch64-linux-android26 \ --target-sysroot ${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/sysroot \ --target-toolchain ${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin \ --target-lib linux_android_aarch64_cjnative; python3 build.py install --target linux_android_aarch64 --prefix ${WORKSPACE}/cangjie_compiler/output;要点--target-lib linux_x86_64_cjnative/--target-lib linux_android_aarch64_cjnative指定互操作库要链接的仓颉运行时平台目录与运行时output/common下的平台命名对应Android 目标下通过--target-sysroot指向 NDK sysroot从而复用 2.4 节构建进 sysroot 的 OpenSSL 与 zlib构建前sourceSDK 的envsetup.sh是为了让仓颉编译环境cjc等在交叉编译互操作库时可用。五、组织并打包文件5.1 组织并打包 SDKSDK 以cangjie_compiler/output为核心组装体连同上游开源声明文件一起打包# 清空历史构建 mkdir -p $WORKSPACE/software; rm -rf $WORKSPACE/software/*; cd $WORKSPACE/software; # 拷贝cangjie目录 cp -R $WORKSPACE/cangjie_compiler/output cangjie; cp $WORKSPACE/cangjie_compiler/LICENSE cangjie; cp $WORKSPACE/cangjie_compiler/Open_Source_Software_Notice.docx cangjie; # 打包和设置权限 chmod -R 750 cangjie tar --formatgnu -zcvf cangjie-sdk-${SDK_NAME}-${CANGJIE_VERSION}.tar.gz cangjie; chmod 550 cangjie-sdk-${SDK_NAME}-${CANGJIE_VERSION}.tar.gz;tar --formatgnu指定 GNU tar 格式以保证跨平台解压兼容性权限 750/550 分别限制目录与包文件的访问范围。仓颉项目采用 Apache-2.0 with Runtime Library Exceptions 许可参见本仓库的 LICENSESDK 包内附带LICENSE与Open_Source_Software_Notice.docx即用于满足开源合规要求。5.2 组织并打包 StdxSTDX 扩展库与 SDK 分开打包作为独立的 zip 产物cd $WORKSPACE/software; # 拷贝stdx目录 cp -r $WORKSPACE/cangjie_stdx/target/linux_android_aarch64_cjnative .; cp $WORKSPACE/cangjie_stdx/LICENSE linux_android_aarch64_cjnative; cp $WORKSPACE/cangjie_stdx/Open_Source_Software_Notice.docx linux_android_aarch64_cjnative; chmod -R 750 linux_android_aarch64_cjnative; zip -qr cangjie-stdx-android-aarch64-${CANGJIE_VERSION}.${STDX_VERSION}.zip linux_android_aarch64_cjnative; chmod 550 cangjie-stdx-android-aarch64-${CANGJIE_VERSION}.${STDX_VERSION}.zip;六、编译 Hello, Cangjie 程序并验证首先检查打包产物是否符合预期ls -lh $WORKSPACE/software # 应包含 # - cangjie-sdk-${SDK_NAME}-${CANGJIE_VERSION}.tar.gz # - cangjie-stdx-android-aarch64-${CANGJIE_VERSION}.${STDX_VERSION}.zip然后使用打包产物直接验证编译与运行能力cd $WORKSPACE; source $WORKSPACE/software/cangjie/envsetup.sh; echo main() { println(\Hello, Cangjie\) } hello.cj cjc hello.cj -o hello ./hello # 您将在控制台看到以下输出 # Hello, Cangjie注意这里source的是$WORKSPACE/software/cangjie/envsetup.sh即最终打包目录中的环境脚本验证的是交付物本身而非中间构建目录——当控制台输出Hello, Cangjie时说明 SDK 中宿主机侧的cjc编译器、运行时及其依赖链路全部就绪。至此linux-x64-android仓颉 SDK 的完整集成构建成功完成。七、延伸阅读各环境构建指导书总入口中文/英文README_zh.md、README.mdLinux 原生构建docs/linux.mdLinux - Windows 交叉构建docs/linux_cross_windows.mdLinux - Windows Android 交叉构建docs/linux_cross_windows_android.mdMacOS - Android 交叉构建docs/macos_android.md组件与构建工具版本要求对照表docs/env.md英文版 doc_en/env.md本文英文原版doc_en/linux_android.md赞分享文档教程构建工具【免费下载链接】cangjie_build仓颉SDK集成构建指导书。项目地址https://gitcode.com/Cangjie/cangjie_build点击查看免费下载相关推荐scrcpy 安卓投屏完整教程免 Root5 分钟用键鼠控制手机scrcpy 安卓投屏完整教程免 Root5 分钟用键鼠控制手机 scrcpy 是一款免费开源的工具专门解决安卓手机投屏到电脑这件事把手机屏幕实时镜像到音视频IceCubesApp 深度拆解SwiftUI 驱动的多平台 Mastodon 客户端——从架构到落地的完整解读IceCubesApp 深度拆解SwiftUI 驱动的多平台 Mastodon 客户端——从架构到落地的完整解读 开篇速览纯 SwiftUI 写成的 Mas移动开发社交cangjie_build 中的仓颉 SDK Linux 原生构建完整指南环境搭建、组件编译到打包验证cangjie_build 中的仓颉 SDK Linux 原生构建完整指南环境搭建、组件编译到打包验证 本文基于 cangjie_build 仓库中的 Lin文档教程构建工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑