---
title: 编译工具使用
description: "编译工具asn1rs-cli，位于“/usr/local/ksl/bin”下。用户可以使用它来解析ASN.1脚本，并将ASN.1脚本转换为C语言代码的中间文件（包含多个源文件和头文件）。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_ksl_16_0153.html
sourcePath: /source/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_ksl_16_0153.html
indexId: 5122ba17cfa0fdaa6ee78cb3d570d74718fc1abada0b68584093e4f1813aa63476
---
# 编译工具使用

编译工具asn1rs-cli，位于“/usr/local/ksl/bin”下。用户可以使用它来解析ASN.1脚本，并将ASN.1脚本转换为C语言代码的中间文件（包含多个源文件和头文件）。

在本章节的示例中，将展示如何使用编译工具asn1rs-cli将.asn文件转换为C语言源码文件。

#### 获取帮助

执行以下命令获取命令相关帮助。

```
./asn1rs-cli --help
```

输出如下回显信息。

```
ASN.1 Rust Compiler 1.2.0
USAGE:
asn1rs-cli [FLAGS] [OPTIONS] --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> [SUBCOMMAND]
FLAGS:
-C, --comments        提取日志信息到抽象语法文件中
-D, --debug           打印调试信息到文件
-h, --help            Prints help information
-r, --intermediate    导出中间结果到文件
-V, --version         Prints version information
OPTIONS:
--dump-types <csv文件路径>
控制台输出编译出的类型列表至csv文件
-i, --input <ASN.1 文件(列表)>
选择一个或多个 ASN.1 文本文件，如 -i s1.asn x2.asn; 也可利用通配，如 -i *.asn
--merge <合并后的目录名，支持指定多级目录，如a/b/c，最终输出目录在exports/a/b/c>
合并编译，未合并情况下每个ASN.1文件将独立进行编译和输出，存在该选项则将所有输入的ASN.1文件合并生成目标文件
-m, --method <传输语法(aper|uper|eper|ber...)>
选择一个编解码规则，选中的编解码规则会应用到当前命令行的所有输入文件中
SUBCOMMANDS:
cc       [核心] 将 ASN.1 文件编译为 C 代码
cceos    [扩展] C 后端 LTE EOS 版本
ccnr     [核心] 将 ASN.1 文件编译为 CPP 代码
diff     [扩展] 比对ASN.1文件的版本变更是否符合要求
help     Prints this message or the help of the given subcommand(s)
xmlc     [核心] 将 ASN.1 文件编译为 XML 文件
```


#### 子参数

该工具还有一系列子参数，例如cc子参数的帮助信息可执行以下命令查看。

```
./asn1rs-cli cc --help
```

输出如下回显信息。

```
asn1rs-cli-cc
[核心] 将 ASN.1 文件编译为 C 代码
USAGE:
asn1rs-cli --input <ASN.1 文件(列表)> --method <传输语法(aper|uper|eper|ber...)> cc [FLAGS] [OPTIONS]
FLAGS:
--count-like-present    当 SEQUENCE OF 类型作为可选成员时，利用其 count 字段在接口中充当 present 标识
-h, --help                  Prints help information
--testcases             围绕已经定义的值，生成 testcase 的C文件和头文件, 依赖 --values
--values                生成所有值的定义, 依赖 --mode full
-V, --version               Prints version information
OPTIONS:
-C, --cinline <需要生成内联C代码的类型列表，使用逗号隔开，由于生成代码可能非常多，不支持直接生成全部类型>
由于指定类型被直接展开为包含编解码逻辑的C代码，生成代码时编译程序将做一定程度的优化，使用该开关可以优化指定类型的编解码性能
--enum-as-uint <数据类型的名字(u8|u16|u32)>
设定ENUMERATED类型的C接口为u8,u16,u32数据类型，不使用C的enum类型
-e, --extension <扩展(rust)>
rust-用于生成Native-Rust的头文件
--limits <规格配置文件，用于指定C数组的规格宏>
有关规格文件的 SCHEMA, 可以阅读 libcompiler/asn1rs-cli/examples/limits.schema.json
-A, --long-abbrs <支持全词匹配功能的缩略表文件路径>
样例文件可以参考 libcompiler/asn1rs-cli/examples/long-abbrs.csv
-m, --mode <编译模式(full|noinf)>
full-完整生成接口和表的源码; noinf-仅生成表的源码; 默认-noinf
-p, --prefix <生成C代码符号的前缀名字>
大小写不敏感
-a, --short-abbrs <支持单词匹配功能的缩略表文件路径>
样例文件可以参考 libcompiler/asn1rs-cli/examples/short-abbrs.csv
-T, --try-compile <libcodec相对路径, 例如 ../libcodec>
尝试编译生成代码, 目前只支持目标语言为C/C++的场景, 编译器为GCC
```


#### 示例

将一个ASN.1脚本test.asn转换成BER模式的C代码文件。

1. test.asn脚本内容如下：

```
MyModule DEFINITIONS AUTOMATIC TAGS ::= BEGIN
MyType ::= SEQUENCE {
boolType BOOLEAN,
intType INTEGER(0..128),
enumType ENUMERATED { a, b },
bitStrType BIT STRING(SIZE(0..128)),
octStrType OCTET STRING(SIZE(0..64)),
seqOfType SEQUENCE OF INTEGER,
choiceType CHOICE {
a INTEGER(0..3),
b BOOLEAN
}
}
END
```


2. 使用asn1rs-cli命令进行转换。

```
./asn1rs-cli -i test.asn -m ber cc -m full
```

生成的代码文件位于“exports”目录。
```
exports
└── test
├── codec_index.h
├── codec_interfaces.h
└── codec_tables.c
```


  - codec_index.h：定义了各个数据单元的唯一标识，在后续的编解码接口中需要使用到。
  - codec_interfaces.h：提供了抽象语法中数据描述的C程序接口。
  - codec_tables.c：定义了用于描述各个数据类型的静态变量。
若指定了--values --testcases参数还会生成codec_testcases.h、codec_values.c、codec_values.h三个文件，用于定义和声明脚本中定义的值，并生成测试用例。
