最新libsrtp库的编译与测试方法

本文详细介绍了如何在Ubuntu 16.04.5 LTS系统中编译和安装libSRTP库,包括安装git、下载源码、配置、编译、测试和安装等步骤。在编译过程中,使用了`./configure`进行配置,并通过`make`和`make install`完成编译和安装。测试部分展示了如何运行测试用例确保编译成功。
部署运行你感兴趣的模型镜像


1. 环境

在 Ubuntu 16.4.5 TLS 版本中编译和测试通过。

下载最新的源代码需要git,若没有安装git可以使用下面命令进行安装:

sudo apt-get install git -y
1
2. 编译及安装

2.1 下载源码

git clone https://github.com/cisco/libsrtp.git
1
2.2 进入源码目录

cd libsrtp
1
2.3 配置

配置命令如下:

./configure
1
执行结果,如下所示:

cgs@ubuntu:~/libsrtp$ ./configure
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking how to run the C preprocessor... gcc -E
checking for ar... ar
checking the archiver (ar) interface... ar
checking for ranlib... ranlib
checking for a BSD-compatible install... /usr/bin/install -c
checking for a sed that does not truncate output... /bin/sed
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking whether byte ordering is bigendian... no
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking whether gcc accepts -Werror... yes
checking whether gcc accepts -fPIC... yes
checking whether gcc accepts -Wall... yes
checking whether gcc accepts -pedantic... yes
checking whether gcc accepts -Wstrict-prototypes... yes
checking whether gcc accepts -O4... yes
checking whether gcc accepts -fexpensive-optimizations... yes
checking whether gcc accepts -funroll-loops... yes
checking whether gcc accepts -Wno-language-extension-token... no
checking for ANSI C header files... (cached) yes
checking for unistd.h... (cached) yes
checking for byteswap.h... yes
checking for stdint.h... (cached) yes
checking for sys/uio.h... yes
checking for inttypes.h... (cached) yes
checking for sys/types.h... (cached) yes
checking for machine/types.h... no
checking for sys/int_types.h... no
checking for sys/socket.h... yes
checking for netinet/in.h... yes
checking for arpa/inet.h... yes
checking for windows.h... no
checking for int8_t... yes
checking for uint8_t... yes
checking for int16_t... yes
checking for uint16_t... yes
checking for int32_t... yes
checking for uint32_t... yes
checking for uint64_t... yes
checking size of unsigned long... 8
checking size of unsigned long long... 8
checking for an ANSI C-conforming const... yes
checking for inline... inline
checking for size_t... yes
checking for socket... yes
checking for inet_aton... yes
checking for usleep... yes
checking for sigaction... yes
checking whether to enable debug logging in all modules... no
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking whether to leverage OpenSSL crypto... no
checking whether to leverage NSS crypto... no
checking for pcap_create in -lpcap... no
checking for pcap_create in -lwpcap... no
checking whether to redirect logging to stdout... no
checking wheather to use a file for logging... no
checking for extra C compiler flags... no
configure: creating ./config.status
config.status: creating Makefile
config.status: creating crypto/Makefile
config.status: creating doc/Makefile
config.status: creating libsrtp2.pc
config.status: creating crypto/include/config.h

配置命令可附加参数,格式如下:

./configure [ options ]
1
options可选参数如下表所示:

Option    Description
–help -h    Display help
–enable-debug-logging    Enable debug logging in all modules
–enable-log-stdout    Enable logging to stdout
–enable-openssl    Enable OpenSSL crypto engine
–enable-openssl-kdf    Enable OpenSSL KDF algorithm
–with-log-file    Use file for logging
–with-openssl-dir    Location of OpenSSL installation
2.4 编译

编译命令如下:

make
1
执行结果,如下所示:

cgs@ubuntu:~/libsrtp$ make
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c srtp/srtp.c -o srtp/srtp.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c srtp/ekt.c -o srtp/ekt.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/cipher/cipher.c -o crypto/cipher/cipher.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/cipher/null_cipher.c -o crypto/cipher/null_cipher.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/cipher/aes_icm.c -o crypto/cipher/aes_icm.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/cipher/aes.c -o crypto/cipher/aes.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/hash/null_auth.c -o crypto/hash/null_auth.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/hash/auth.c -o crypto/hash/auth.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/hash/hmac.c -o crypto/hash/hmac.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/hash/sha1.c -o crypto/hash/sha1.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/math/datatypes.c -o crypto/math/datatypes.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/math/stat.c -o crypto/math/stat.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/kernel/crypto_kernel.c -o crypto/kernel/crypto_kernel.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/kernel/alloc.c -o crypto/kernel/alloc.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/kernel/key.c -o crypto/kernel/key.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/kernel/err.c -o crypto/kernel/err.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/replay/rdb.c -o crypto/replay/rdb.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/replay/rdbx.c -o crypto/replay/rdbx.o
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -c crypto/replay/ut_sim.c -o crypto/replay/ut_sim.o
ar cr libsrtp2.a srtp/srtp.o srtp/ekt.o crypto/cipher/cipher.o crypto/cipher/null_cipher.o crypto/cipher/aes_icm.o crypto/cipher/aes.o crypto/hash/null_auth.o crypto/hash/auth.o crypto/hash/hmac.o crypto/hash/sha1.o crypto/math/datatypes.o crypto/math/stat.o crypto/kernel/crypto_kernel.o crypto/kernel/alloc.o crypto/kernel/key.o crypto/kernel/err.o crypto/replay/rdb.o crypto/replay/rdbx.o crypto/replay/ut_sim.o
ranlib libsrtp2.a
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -I./test -L.  -o crypto/test/aes_calc crypto/test/aes_calc.c test/util.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  -o crypto/test/cipher_driver crypto/test/cipher_driver.c test/getopt_s.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -I./test -L.  -o crypto/test/datatypes_driver crypto/test/datatypes_driver.c test/util.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  -o crypto/test/kernel_driver crypto/test/kernel_driver.c test/getopt_s.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -I./test -L.  -o crypto/test/sha1_driver crypto/test/sha1_driver.c test/util.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  crypto/test/stat_driver.c -o crypto/test/stat_driver -lsrtp2 
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  -o crypto/test/env crypto/test/env.c test/getopt_s.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  -o test/srtp_driver test/srtp_driver.c test/util.c test/getopt_s.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  test/replay_driver.c -o test/replay_driver -lsrtp2 
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  test/roc_driver.c -o test/roc_driver -lsrtp2 
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  -o test/rdbx_driver test/rdbx_driver.c test/getopt_s.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  -o test/rtpw test/rtpw.c test/rtp.c test/util.c test/getopt_s.c crypto/math/datatypes.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -L.  -o test/dtls_srtp_driver test/dtls_srtp_driver.c test/getopt_s.c test/util.c libsrtp2.a  -lsrtp2
gcc -DHAVE_CONFIG_H -Icrypto/include -I./include -I./crypto/include  -fPIC -Wall -pedantic -Wstrict-prototypes -O4 -fexpensive-optimizations -funroll-loops -I./test -L.  -o test/test_srtp test/test_srtp.c libsrtp2.a  -lsrtp2
Build done. Please run 'make runtest' to run self tests.

2.5 测试编译结果

使用下面命令测试编译结果(编译成功时最后有提示运行该命令)

make runtest
1
执行结果,如下所示:

cgs@ubuntu:~/libsrtp$ make runtest
Build done. Please run 'make runtest' to run self tests.
running libsrtp2 test applications...
crypto/test/cipher_driver -v >/dev/null
crypto/test/kernel_driver -v >/dev/null
test/test_srtp >/dev/null
test/rdbx_driver -v >/dev/null
test/srtp_driver -v >/dev/null
test/roc_driver -v >/dev/null
test/replay_driver -v >/dev/null
test/dtls_srtp_driver >/dev/null
cd test;  /home/cgs/workspace/libsrtp/test/rtpw_test.sh -w /home/cgs/workspace/libsrtp/test/words.txt >/dev/null
libsrtp2 test applications passed.
make -C crypto runtest
make[1]: Entering directory '/home/cgs/workspace/libsrtp/crypto'
test/env # print out information on the build environment
CPU set to little-endian        (WORDS_BIGENDIAN == 0)
CPU set to CISC                (CPU_CISC == 1)
using native 64-bit type        (NO_64_BIT_MATH == 0)
running crypto test applications...
test `test/aes_calc 000102030405060708090a0b0c0d0e0f 00112233445566778899aabbccddeeff` = 69c4e0d86a7b0430d8cdb78070b4c55a
test `test/aes_calc 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 00112233445566778899aabbccddeeff` = 8ea2b7ca516745bfeafc49904b496089
test/cipher_driver -v >/dev/null
test/datatypes_driver -v >/dev/null
test/stat_driver >/dev/null
test/sha1_driver -v >/dev/null
test/kernel_driver -v >/dev/null
crypto test applications passed.
make[1]: Leaving directory '/home/cgs/workspace/libsrtp/crypto'

2.6 安装

安装命令如下(特别需要注意前面的 sudo,否则会出现安装错误):

sudo make install
1
执行结果,如下所示:

cgs@ubuntu:~/libsrtp$ sudo make install
[sudo] password for cgs: 
/usr/bin/install -c -d /usr/local/include/srtp2
/usr/bin/install -c -d /usr/local/lib
cp ./include/srtp.h /usr/local/include/srtp2
cp ./crypto/include/cipher.h /usr/local/include/srtp2
cp ./crypto/include/auth.h /usr/local/include/srtp2
cp ./crypto/include/crypto_types.h /usr/local/include/srtp2
if [ -f libsrtp2.a ]; then cp libsrtp2.a /usr/local/lib/; fi
if [ -f libsrtp2.dll.a ]; then cp libsrtp2.dll.a /usr/local/lib/; fi
if [ -f libsrtp2.so.1 ]; then \
    /usr/bin/install -c -d /usr/local/lib; \
    cp libsrtp2.so.1 /usr/local/lib/; \
    cp libsrtp2.so /usr/local/lib/; \
    if [ -n "1" ]; then \
        ln -sfn libsrtp2.so.1 /usr/local/lib/libsrtp2.so; \
    fi; \
fi
/usr/bin/install -c -d /usr/local/lib/pkgconfig
cp ./libsrtp2.pc /usr/local/lib/pkgconfig/

至此,编译安装完成。

3. 测试

首先,进入libsrtp的测试文件目录

cd test
1
然后,执行测试命令如下

./rtpw_test.sh
1
执行结果,如下所示:

cgs@ubuntu:~/libsrtp$ cd test
cgs@ubuntu:~/libsrtp/test$ ./rtpw_test.sh
./rtpw_test.sh : starting rtpw receiver process...
./rtpw_test.sh : receiver PID = 23269
Using libsrtp2 2.3.0-pre [0x2030000]
security services: confidentiality message authentication
set master key/salt to 2b2edc5034f61a72345ca5986d7bfd01/89aa6dc2ecab32fd9af74df6dfc6
0
./rtpw_test.sh : starting rtpw sender process...
./rtpw_test.sh : sender PID = 23273
Using libsrtp2 2.3.0-pre [0x2030000]
security services: confidentiality message authentication
set master key/salt to 2b2edc5034f61a72345ca5986d7bfd01/89aa6dc2ecab32fd9af74df6dfc6
    word: abducing

sending word: abducing
0
sending word: acidheads
    word: acidheads

sending word: acidness
    word: acidness

sending word: actons
    word: actons

sending word: admixtures
    word: admixtures

sending word: affidavit
    word: affidavit

sending word: agelastic
    word: agelastic

./rtpw_test.sh : starting rtpw receiver process... 
./rtpw_test.sh : receiver PID = 23277
Using libsrtp2 2.3.0-pre [0x2030000]
security services: confidentiality message authentication
set master key/salt to 033490ba9e82994fc210133957390389/92b2edc5034f61a72345ca598d7b
0
./rtpw_test.sh : starting rtpw sender process...
./rtpw_test.sh : sender PID = 23281
Using libsrtp2 2.3.0-pre [0x2030000]
security services: confidentiality message authentication
set master key/salt to 033490ba9e82994fc210133957390389/92b2edc5034f61a72345ca598d7b
    word: abducing

sending word: abducing
0
sending word: acidheads
    word: acidheads

sending word: acidness
    word: acidness

sending word: actons
    word: actons

sending word: admixtures
    word: admixtures

sending word: affidavit
    word: affidavit

sending word: agelastic
    word: agelastic

./rtpw_test.sh : done (test passed)

4. 常见问题

Q:执行安装命令 make install ,出现安装失败,错误信息如下:

cgs@ubuntu:~/libsrtp$ make install
/usr/bin/install -c -d /usr/local/include/srtp2
/usr/bin/install: cannot change permissions of ‘/usr/local/include/srtp2’: No such file or directory
Makefile:268: recipe for target 'install' failed
make: *** [install] Error 1
1
2
3
4
5
A:由于安装需要向 /usr/bin、/usr/local等目录拷贝文件,需要su权限,所以需要调整安装命令为 sudo make install ,即命令前面增加 sudo ,并根据提示输入su密码即可安装成功。

5. 参考资料

官方文档《Installing and Building libSRTP》
https://github.com/cisco/libsrtp#installing-and-building-libsrtp

libsrtp库的编译与测试方法
https://blog.youkuaiyun.com/stone_overlooking/article/details/73896198
————————————————
版权声明:本文为优快云博主「cgs1999」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/cgs1999/article/details/89704359

注:按照官方文档编译有问题

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 检查 libsrtp 是否生成 `.so` 动态文件 要验证 libsrtp 是否成功生成了 `.so` 文件,可以通过以下几种方式进行检查: 1. **直接查看构建目录**:在完成 `make` 编译后,进入源码目录下的构建目标路径(通常是 `.libs/` 或项目根目录),使用 `ls` 命令列出所有生成的文件。若看到类似 `libsrtp2.so` 的文件,则表示动态已成功生成。 示例命令: ```bash ls .libs/libsrtp2.so ``` 如果该命令输出了 `.so` 文件名,则说明动态已被正确构建[^1]。 2. **使用 `file` 命令分析文件类型**:可以对生成的 `.so` 文件执行 `file` 命令以确认其为共享对象文件。 示例命令: ```bash file .libs/libsrtp2.so ``` 输出示例: ``` .libs/libsrtp2.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., not stripped ``` 上述输出表明这是一个标准的 ELF 格式共享文件[^2]。 3. **检查 `make` 构建输出信息**:在执行 `make` 命令时,观察终端输出是否包含生成 `.so` 文件的相关信息。通常会看到链接器调用 `gcc -shared` 来创建共享的命令行。 示例输出片段: ``` gcc -shared -o .libs/libsrtp2.so ... ``` 若在构建过程中出现此类输出,则说明正在尝试生成 `.so` 文件。 4. **运行 `nm` 或 `readelf` 查看符号表**:可以使用这些工具进一步验证 `.so` 文件是否具有完整的符号信息,确保它是一个合法的动态。 示例命令: ```bash nm .libs/libsrtp2.so | grep ' T ' readelf -s .libs/libsrtp2.so ``` 这些命令将列出 `.so` 文件中的函数符号,有助于判断其内容是否完整有效。 5. **测试链接行为**:在实际项目中使用 libsrtp 时,通过构建一个依赖它的程序来验证是否能够自动选择 `.so` 文件进行动态链接。例如,在 CMake 中配置 `target_link_libraries` 时,系统会优先查找 `.so` 文件。 示例 CMake 配置: ```cmake target_link_libraries(myapp PRIVATE srtp2) ``` 在链接阶段,系统会自动搜索 `libsrtp2.so` 或 `libsrtp2.a`,若 `.so` 存在且可访问,则会使用动态进行链接[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值