为什么说LD_LIBRARY_PATH不好

Linux中PATH,LIBRARY_PATH和LD_LIBRARY_PATH简单说明 本文主要描述关于Linux中PATH,LIBRARY_PATH和LD_LIBRARY_PATH的简单说明 阅读详情

对于一个Unix系统管理员来说,频繁使用LD_LIBRARY_PATH是不好的。

LD_LIBRARY_PATH有什么用

LD_LIBRARY_PATH是一个环境变量,它的作用是让动态链接库加载器(ld.so)在运行时(run-time)有一个额外的选项,即增加一个搜索路径列表。这个环境变量中,可以存储多个路径,用冒号分隔。它的厉害之处在于,搜索LD_LIBRARY_PATH所列路径的顺序,先于嵌入到二进制文件中的运行时搜索路径,也先于系统默认加载路径(如/usr/lib)。出于安全原因,对于已经设置setuid或setgid的可执行文件,LD_LIBRARY_PATH则被完全忽略。从而让LD_LIBRARY_PATH的用处大打折扣。

为什么会有LD_LIBRARY_PATH

LD_LIBRARY_PATH的需求有很多:

  • 测试新链接库与原版的差别(比如后向兼容或新功能测试)
  • 当你想将链接库转移到别的位置时,暂时地测试一下

然而,一个并不招人喜欢的副作用是,LD_LIBRARY_PATH在链接阶段也会被搜索,顺序位于-L所指定的目录之后(没有-L选项当然也会搜索)。

所以,好的使用LD_LIBRARY_PATH的例子应该是:

  • 升级共享库时,替换之前先测试一下
  • 类似的,升级后的某个程序可能依赖于一些动态链接库,如果你将某个链接库替换了,程序可能就无法工作了。这时候,你可以使用LD_LIBRARY_PATH指向存有备份的一个目录,然后,你可以没有顾忌地替换系统版本了。万一出错,拷贝回去就是了。
  • X11在构建过程中使用LD_LIBRARY_PATH。X11将其字体发布为bdf格式,而构建过程中,则需要将bdf编译成pcf格式。LD_LIBRARY_PATH用来指向构建时的lib目录,使得bdftopcf程序能够顺利运行,直到动态链接库安装。
  • Perl将其大部分核心代码封装为一个共享库。这使得Perl便于嵌入到其它程序中去,因为应用程序在链接时可以使用动态库,从而在运行时节约了空间。但是Perl构建和安装时频繁使用Perl脚本,而作为脚本解析器的可执行文件"perl"找不到动态链接库是无法执行的,这时候就需要用到LD_LIBRARY_PATH来引导这个过程。

LD_LIBRARY_PATH是如何犯错的

当已经失误(未能在编译时嵌入路径),人们常用LD_LIBRARY_PATH来补救。一些程序(甚至是商业程序)常常在编译时没有考虑任何运行时目录,于是用户不得不使用LD_LIBRARY_PATH,否则程序就运行不了。

LD_LIBRARY_PATH就是这样一个狡猾的家伙,一旦它成了一个全局的变量,用户就会一直依赖于它。然后,当LD_LIBRARY_PATH需要修改或删除时,大规模破坏就会发生。

共享库加载器是怎样工作的

SunOS 4.x使用主(major)版本和次(minor)版本。比如,软件库Xt的名字会类似于libXt.so.4.10,它的主版本是4,次版本是10。如果你更新这个库(比如,修正了一个Bug),你可能会安装库libXt.so.4.11,这时程序会自动使用新的版本。为了实现这一点,加载器必须对每一个加载目录都执行一次readdir()函数,然后解析正确的文件名。如果目录中文件很多,或包含链接,或访问NFS网络文件系统,这个操作是非常费时的。

Linux,SunOS 5.x和大部分其它SYSV变种仅使用主版本。软件库Xt的名字类似于libXt.so.4。Linux的库文件名迷惑性地包含了次版本,但是,总会有一个链接指向真正的库文件,该链接名是不包含次版本的。比如,库libXt.so.6实际上是libXt.so.6.0的链接。链接器/加载器实际上搜索的是libXt.so.6。

除了不考虑基于次版本的更新(管理员自己负责更新),加载器的工作本质上还是一样的,只不过,只执行一次stat()函数,因而速度更快。

编译时和运行时路径分家前的黑暗岁月

现在,你可以在链接时为一个可执行文件指定运行时路径,语法是为ld指定-R(或-rpath)选项。你还可以使用LD_RUN_PATH环境变量,功能和-R一样。

但是,此前,你只能使用-L,它不仅影响编译时,还影响运行时。没有"编译时使用一个路径而在运行时使用另一个路径"的说法。因为这个限制,当时存在些一些相当有名的失败模式。比如,你在自动挂载的NFS目录中构建X11R6(/home/snoopy/src)。X11R6由共享库和可执行文件构成。这些可执行文件是在构建树中而非在最终安装位置决定依赖于哪些库的。由于链接器必须在编译时解析代码符号,因此必须使用-L选项同时指定链接时路径和最终的运行时路径(比如/usr/local/X11R6/lib)。结果是,使用这些共享库的程序必须先在/home/snoopy/src搜索,然后再在正确的位置(比如,/usr/local/X11R6/lib)搜索。不是每次启动X11R6,NFS都会自动挂载构建目录(/home/snoopy/src)。很有可能,多年以前那个临时构建目录就已经被删除了,加载器仍然却尝试去那儿搜索。更糟糕的是,若snoopy用户挂了或不复存在,那么所有X11R6程序都无法再运行。太无赖了!!! 令人高兴的是,对于拥有现代链接器/加载器的操作系统的你来说,这些都已成往事。此外,解决这个问题的另外一个方法是在-L选项中将运行时目录置于链接时目录之前。

不幸案例1

根据真实故事改编。

我遇到的第一次这一类状况来自于SunOS 4.x下的OpenWindows。 由于一些混帐原因,几个OpenWindows程序在编译时没有嵌入正确的运行时加载器路径,用户被迫一直使用LD_LIBRARY_PATH。强调一下,是一直在使用。也就是在全局的OpenWindows的启动脚本中系统自动将LD_LIBRARY_PATH设置为($OPENWINHOME/lib)。

那好,这有什么大不了的? 但是,碰巧的是,同一台机器上刚好曾经编译过X11R4,位于/usr/local/X11R4中。这样,用户会摸头不知脑,因为运行的X11R4程序使用的居然是OpenWindows在/usr/openwin/lib中的共享库,而非/usr/local/X11R4/lib/。X11R5以及随后的X11R6问世之后,用户也只会变得更迷惑,因为此时已经有同一个共享库的4个不同版本,它们很可能相互不兼容。

呵呵,对于这种情况,你该怎么办? 如果你让LD_LIBRARY_PATH首先指向OpenWindows,最好的情况是拖慢系统速度(因为大多数人使用的是X11R5和X11R6,搜索/usr/openwin/lib只是浪费时间)。最坏的情况是生成莫名其妙的警告("ld.so: warning: libX11.x.y has older revision than expected z"),或者导致程序由于不兼容而崩溃。如果你尝试编译X应用程序而忘记使用-L选项,你同样会感到迷惑。

当时,我是怎么办的呢? 我用emacs打开几个OpenWindows的程序,将其错误的运行时路径修改为/usr/openwin/lib(事实上,这些程序是用系统补丁修改的,而打补丁的同志们的系统环境和FCS那帮人不一样)。然后,我修改了所有的启动脚本,删除了setenv LD_LIBRARY_PATH语句。我甚至在自己的.cshrc中添加unsetenv LD_LIBRARY_PATH来做测试。

不幸案例2

根据真实故事改编。

由于版权问题,商业程序通常会带有一个二进制Motif库的副本。Motif是一个商业软件库,并不是每一个操作系统都附带,但却是很多商业程序的常用工具。因为Motif是一个不断更新的产品,得到很好的维护,也常有新功能加入。

WidgetMan就是这样一个使用了Motif的软件。在它的启动脚本里,将LD_LIBRARY_PATH指向它的Motif库的副本,以便在运行时使用。但是,WidgetMan的设计用途是启动其它程序。不幸的是,当WidgetMan启动其它应用时,LD_LIBRARY_PATH的值会被继承。所以从WidgetMan启动的程序就杯具了,因为它们使用的是WidgetMan所包含的Motif库,而非系统的Motif库,这两者版本相同却互不兼容。我了个去!!!

想象一下,按照无良商业软件的指示去设置全局的LD_LIBRARY_PATH是一件多么危险的事。

无益的改进

一些操作系统(比如Linux)支持一个可配置的加载器。你可以通过修改/etc/ld.so.conf来配置运行时的搜索路径。这个办法几乎和修改LD_LIBRARY_PATH一样差劲。这个文件绝对不要随便修改,它里面只应该包含操作系统标准的库目录。

规范的LD_LIBRARY_PATH使用方法

  • 绝不要设置全局的LD_LIBRARY_PATH
  • 如果你一定要发布(ship)一个依赖于标准库的程序,而且要把它安装到非标准位置,按下面方法之一实施:
    • 发布二进制.o文件,在安装过程中使用正确的已安装的库来重新链接。
    • 发布可执行文件时,嵌入一个很长的虚假运行时库路径,在安装过程中,使用二进制编辑器将其替换为正确的库路径。
  • 如果你必须使用LD_LIBRARY_PATH,将其封装起来(如在局部的脚本中使用),而不至于影响其它程序。

一些软件包在标准目录中生成一些链接,指向真正的位置。这个办法行得通,但是并没有解决这个问题。如果你安装了两个版本怎么办? 更不用说很多厂商自作主张选择一些很愚蠢的位置作为"标准"路径(比如/或/usr)。这个办法也使得网络安装变得困难,因为即使你安装了一个程序到某个网络目录中,你还需要到此网络中每一台计算机中生成这样一个链接。

改进UNIX中LD_LIBRARY_PATH的实现的一些想法

  • 取消链接时对LD_LIBRARY_PATH的依赖。(Solaris中ld可以通过-i选项做到这一点)。人们懒于设置-L选项而直接使用LD_LIBRARY_PATH的事情太频繁发生了,这就导致了其它程序运行时的杯具。当然,一些人设置LD_LIBRARY_PATH是为了让某些程序正常运行,但是这却会影响那些没有正确使用-L选项者的正确链接。如果LD_LIBRARY_PATH只能影响运行时,则关系显得清晰多了。如果有必要的话,发明一些其它的环境变量来专门负责链接时路径的设置(类似于LD_LINK_PATH?)。
  • 操作系统发布时自带安全修改可执行文件运行库路径的工具。
  • 为ldd实现-s选项,使其能够打印某个程序的运行时路径。(Solaris的dump -Lv可以实现这个功能)。
  • Solaris 7有一个比较干净的想法。你可以在链接时指定一个运行时路径表达式,该表达式在运行时解析,然后得到最终的运行时路径。比如在链接时指定rpath为$ORIGIN/../lib,而$ORIGIN在运行时才会展开为安装路径。这样,即使你将安装树完全转移,它仍然可以正常工作。强烈要求其它操作系统也这样做。遗憾的是,至少在Solaris 7中,$ORIGIN被视为是一个相对路径(你可以破坏它,只要在同一个文件系统中有一个可写目录,因为UNIX甚至允许硬链接到一个setuid可执行文件),所以对于setuid/setgid二进制文件,$ORIGIN会被忽略。Sun公司在Solaris 8中修复了这个问题,你可以指定"可靠的"crle(1)路径。
转自:http://www.ituring.com.cn/article/22101
LD_LIBRARY_PATH的含义 看到shell执行过程中,先export LD_LIBRARY_PATH=XXXX,想查询下这个变量的用途,查询到 LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录): export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除 阅读详情

相关推荐

Linux中PATH、LIBRARY_PATH、LD_LIBRARY_PATH的作用

当编译源代码时,编译器会在这些目录中查找指定的库文件,以便将其链接到可执行文件中。变量中追加 /compile_lib_path/lib 目录,以后编译程序时,编译器将会在 /compile_lib_path/lib 目录中进行库文件的搜索。变量中追加 /ld_path/bin 目录,以后运行程序时,动态链接器将会在 /ld_path/bin 目录中进行共享库的搜索。当运行一个命令时,操作系统会在这些目录中查找相应的可执行文件,并在找到后执行它。此命令将把/exe_path/bin目录添加到系统的。

个人学习记录 1856

LD_LIBRARY_PATH详解

LD_LIBRARY_PATH详解 LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。 非常多的软件没有root权限安装会比较困难,主要就是因为各种系统库文件,也就是LD_LIBRARY_PATH这个环境变量里面的文件。比如前面我提到的lancet软件需要的库文件如下: -llzma -lbz2 -lz -ldl -lpthread -lcurl -lcrypto -lbamtools 可以使用 ls /usr/lib |gr

yueyecheshou1980的博客 4万+

【机器人】转动的指数坐标表示心得理解

转动的指数坐标表示心得理解1.前言2.指数坐标表示旋转矩阵3.原理推导4.矩阵对数、矩阵指数 1.前言 最近因为项目需求,又学习了一点机器人学的东西,参考书籍为《现代机器人学》,该书采用指数坐标、旋量的方式来对机器人进行描述和运动学、动力学建模,让我对机器人有了更深的理解,也是弥补DH参数建模复杂的缺陷,虽然DH法只用4个参数,而旋量需要更多,但是它骚啊! 本文是我学习了转动的指数坐标表示的一个心得体会,如有问题请多多包涵。 2.指数坐标表示旋转矩阵 指数坐标可以用来表示求解旋转矩阵,其原理非常简单巧妙,需

要恰饭得嘛 2328

Linux笔记之LD_LIBRARY_PATH详解

是最后的手段,因为如果不能将库安装到标准位置或调整动态链接器的配置文件时才会使用,因为它可能会导致版本和兼容性问题。是一个环境变量,用于在Linux和类Unix操作系统中指定动态链接器搜索共享库时应查看的目录的列表。但是,如果你的应用程序使用了非标准路径中的共享库,或者你想覆盖默认的库版本,你可以设置。这种方法在编译时将库的路径固定到二进制文件中,减少了运行时的路径搜索和环境变量的依赖。目录中查找共享库,如果在那里找不到,再按照默认的规则进行搜索。的开头,并将这个更新后的路径导出到随后执行的程序的环境中。

小勇博客 1万+

从零到一:构建嵌入式Arm-Linux的Qt MQTT通信框架全指南

本文详细指导如何在嵌入式Arm-Linux平台上从零构建Qt MQTT通信框架,涵盖交叉编译、环境配置、依赖库管理及性能优化。重点针对32位Arm架构,提供完整的工具链配置、编译步骤和实战部署方案,适用于物联网和工业控制等场景。

w8x9y0z1的博客 1000

遥感图像融合实战:5分钟搞懂全色与多光谱图像如何提升分辨率(附Python代码)

本文通过实战案例,详细解析了如何利用全色锐化技术融合全色与多光谱遥感图像,以提升图像分辨率。文章深入浅出地介绍了核心概念、环境配置、经典GS融合算法的Python代码实现,并对比了不同算法的优劣,最后提供了效果评估方法与实战陷阱分析,帮助读者快速掌握遥感图像融合的关键技术。

weixin_29041195的博客 394

Linux环境变量LD_LIBRARY_PATH

Linux环境变量LD_LIBRARY_PATH

小原的博客 1万+

机器人控制入门

机器人控制入门 对于工科领域来说,脱离实践的学习都是肤浅的,对于控制这种强调经验的技术更是如此。如果去问一个程序员怎么学习一块技术,他必然让你去多编程。机器人领域也是。如果想把基本功打扎实,那么实践更是必不可少了。 机器人控制有三个元素:控制器(算法),执行器(电机),传感器; 控制的本质就是将规划系统的指令作为输入信息,将传感器探测得到的状态信息和导航系统的定位

彼岸花 1万+

LD_LIBRARY_PATH 这个是什么

当一个可执行文件执行时,系统会搜索一系列默认的库路径,以查找程序所需的动态链接库。中指定的路径,然后再搜索默认的路径。如果在这些默认的搜索路径下都找不到所需的动态链接库文件,系统会报告动态链接库未找到的错误。环境变量允许您指定自定义的库搜索路径,以便程序可以在指定路径下找到所需的库文件。环境变量来指定自定义的库搜索路径,确保程序可以正常找到所需的动态链接库。系统默认的库路径:这些路径是操作系统预设的默认库搜索路径,通常包括。这样,每次打开新的终端时,都会自动加载指定的库搜索路径设置。

天涯路的专栏 6361

飞行器坐标转换

本文定义的是右手直角坐标系,x−y−zx-y-zx−y−z轴分别为北-天-东。从AAA坐标系到BBB坐标系是分别绕y−z−xy-z-xy−z−x轴,即天-东-北旋转ψ−θ−γψ−θ−γ。如果AAA是惯性系,BBB是机体系,则这三个角度分别为偏航角、俯仰角、横滚角。图1 惯性系到机体系。

gongfuyd的博客 1355

【异常】OpenClaw提示Message ordering conflict - please try again. If this persists, use /new to start a fr

摘要:OpenClaw助手出现"Message ordering conflict"异常时,表明会话消息排序冲突,主要由消息队列时序错乱、会话同步异常或上下文过载引起。解决方案包括:1)基础重试暂停后单发指令;2)最优方案是发送/new重置会话;3)极端情况下需重启客户端或检查指令格式。预防建议包括避免高频并发指令、定期重置会话及确保网络稳定。该报错属业务层异常,不影响账号安全。

奶爸的编程之路,也就一周冷个三天 424

关于LD_LIBRARY_PATH的问题; 为什么说LD_LIBRARY_PATH不好

本人在/etc/environment中设置了环境变量: JAVA_HOME=/opt/java ORACLE_HOME=/home/user2/ LD_LIBRARY_PATH=/usr/lib:/usr/local/lib       正常情况下执行没有问题,但使用sudo XXXXXXX的时候,其他变量都好使,除了LD_LIBRARY_PATH;   经探索,找到原因:

nancygreen的专栏 3186

Oracle EBS Interface/API(43) -自定义AP发票状态说明API

在某项目,客户需求获得AP发票的状态说明,例如对账系统或者某些报表。由于标准系统未提供状态说明,需要通过AP发票的标准Form获得相关业务逻辑,然后自定义AP发票状态说明API。

陈显平的专栏-Oracle EBS 606

把环境变量path删除了怎么办_为什么说LD_LIBRARY_PATH不好

对于一个Unix系统管理员来说,频繁使用LD_LIBRARY_PATH是不好的。LD_LIBRARY_PATH有什么用LD_LIBRARY_PATH是一个环境变量,它的作用是让动态链接库加载器(ld.so)在运行时(run-time)有一个额外的选项,即增加一个搜索路径列表。这个环境变量中,可以存储多个路径,用冒号分隔。它的厉害之处在于,搜索LD_LIBRARY_PATH所列路径的顺序,...

weixin_39559369的博客 557

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

【Proteus仿真】51单片机+DAC0832+数码管制作0-25V电压可调

perseverance51博客 2117

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH的区别

这里写目录标题1. PATH2. LIBRARY_PATH3. LD_LIBRARY_PATH 1. PATH PATH是可执行文件路径 命令行中的命令,如ls等等,都是系统通过PATH找到了这个命令执行文件的所在位置,再run这个命令(可执行文件)。 所以,PATH 配置的路径下的文件可以在任何位置执行,并且可以通过which 可执行文件 命令来找到该文件的位置 查看PATH pi@raspberrypi:~ $ echo $PATH /usr/local/sbin:/usr/local/bin:/u

weixin_48859611的博客 4万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

linux环境变量LIBRARY_PATH和LD_LIBRARY_PATH

文章目录1.LIBRARY_PATH和LD_LIBRARY_PATH区别1.1.两个环境变量的不同1.2.使用场景2.配合CMake实验测试2.0.文件结构2.1.测试1:LIBRARY_PATH包含库目录,LD_LIBRARY_PATH不包含2.2.测试2:LIBRARY_PATH不包含库目录,LD_LIBRARY_PATH包含库目录2.3.测试3:LIBRARY_PATH包含库目录,LD_LIBRARY_PATH包含库目录2.4.测试4:和LD_LIBRARY_PATH同等作用的/etc/ld.so.c

qq_42731705的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux关于 PATH / LD_LIBRARY_PATH / LIBRARY_PATH环境变量的设置和区别

1.1、

weixin_46158019的博客 3235

Linux环境变量设置(PATH/LIBRARY_PATH/LD_LIBRARY_PATH)

参看链接: https://baike.baidu.com/item/LD_LIBRARY_PATH/9391538?fr=aladdin

M2嵌入式 5695

java.library.path和LD_LIBRARY_PATH的介绍与区别

背景 近期要将算法部署到一个机群的虚拟主机(Debian 9.1 gcc 6.3.0)上,采用的是Java + JNI + shared library的方式来完成底层算法能力的部署。 其中需要用到各种第三方库,有从源码编译的,也有直接下载的so,包括OpenCV相关、TensorFlow相关、MKL以OpenMP相关的动态库。 遇到一个问题,libmklml_intel.so 这个库只能放在 LD_LIBRARY_PATH中进行加载,而不能通过java.library.path完成加载,所以有必要搞清楚这

gaussrieman123的博客 1万+

LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

转:https://www.cnblogs.com/panfeng412/archive/2011/10/20/library_path-and-ld_library_path.html LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下: LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,...

5808

Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH

PATH和分别负责可执行文件、库文件编译时和运行时的路径搜索任务。这些环境变量可以通过export命令来修改,向环境变量中添加新路径(比如上面的示例),或者移除已有路径。环境变量那些事儿。

qq_40642828的博客 2271

library path的设置问题 LD_LIBRARY_PATH SHLIB_PATH LIBPATH

由于平时的工作平台都是linux或

惊鸿一瞥 6412
上一篇: Linux yum命令
下一篇: RPM包的制作
Clef
博客等级 码龄12年 125粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值