使用Lua脚本和第三方C模块的应用程序的编译方法转让专利

申请号 : CN201810952474.4

文献号 : CN110858140A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 高祥

申请人 : 苏州迈科网络安全技术股份有限公司

摘要 :

本发明揭示了一种使用Lua脚本和第三方C模块的应用程序的编译方法,包括以下步骤:将Lua脚本使用的第三方C模块编译为静态链接库,获得静态链接库的名称列表;解析Lua脚本,获取Lua脚本使用的第三方C模块也即静态链接库的名称以及相应模块加载接口函数名称的对应列表;通过初始化函数,将Lua脚本使用的第三方C模块也即静态链接库嵌入到应用程序中进行编译,实现静态调用。本发明通过将Lua脚本使用的C模块嵌入到应用程序进行编译,使得应用程序的编译方式可以通用化,无需再为跨平台的适配花费太多时间,同时还能做到让已存在的Lua脚本无需进行任何修改。这大大提高了开发效率,降低了开发成本。

权利要求 :

1.一种使用Lua脚本和第三方C模块的应用程序的编译方法,包括以下步骤:

将Lua脚本使用的第三方C模块编译为静态链接库,获得静态链接库的名称列表;

解析Lua脚本,获取所述静态链接库的Lua脚本使用的第三方C模块名称以及相应模块加载接口函数名称的对应列表;

通过初始化函数,将所述静态链接库的Lua脚本使用的第三方C模块嵌入到应用程序中进行编译,实现静态调用。

2.根据权利要求1所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述将Lua脚本使用的第三方C模块编译为静态链接库,获得静态链接库的名称列表,该步骤具体包括:S1,将Lua脚本使用的第三方C模块编译为静态链接库;

S2,获取所述静态链接库的名称,得到静态链接库的名称列表。

3.根据权利要求2所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述S1,将Lua脚本使用的第三方C模块编译为静态链接库,使用ar工具打包成.a文件。

4.根据权利要求2所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述S2,获取所述静态链接库的名称,得到静态链接库的名称列表,是通过find和sed工具遍历所述静态链接库所在的目录并取出静态链接库的名称。

5.根据权利要求2所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述解析Lua脚本,获取静态链接库的Lua脚本使用的第三方C模块名称以及相应模块加载接口函数名称的对应列表,该步骤具体包括:S3,解析Lua脚本,获取Lua脚本使用的第三方C模块的名称列表;

S4,根据Lua解释器中C模块接口函数的命名格式,获取C模块中开放的模块加载接口函数名称;

S5,解析完Lua脚本后,获得第三方C模块也即静态链接库的名称与模块加载接口函数名称的对应列表。

6.根据权利要求5所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述S3,解析Lua脚本,获取Lua脚本使用的第三方C模块的名称列表,是解析Lua脚本中的require功能模块,根据所述步骤S2中所述静态链接库的Lua脚本使用的第三方C模块的名称列表,判断require的模块是否是第三方C模块或是其中一部分,如果是则记录该第三方C模块的名称。

7.根据权利要求5所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述通过初始化函数,将静态链接库的Lua脚本使用的第三方C模块嵌入到应用程序中进行编译,实现静态调用,该步骤具体包括:S6,设定初始化函数,将Lua脚本使用的第三方C模块全部实现静态调用;

S7,在应用程序中调用所述初始化函数;

S8,编译应用程序,将Lua脚本使用的第三方C模块嵌入到应用程序中。

8.根据权利要求7所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述S6,设定初始化函数,将Lua脚本使用的第三方C模块全部实现静态调用,通过初始化函数luaL_requiref以及所述Lua脚本使用的第三方C模块名称与模块加载接口函数名称的对应列表,自动动态生成,所述初始化函数存放在新增的C文件中。

9.根据权利要求7所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述S7,在应用程序中调用所述初始化函数,是在应用程序中创建Lua虚拟机的代码后,调用所述初始化函数。

10.根据权利要求8所述的使用Lua脚本和第三方C模块的应用程序的编译方法,其特征在于,其中所述S8,编译应用程序,将Lua脚本使用的第三方C模块嵌入到应用程序中,是将所述包含有初始化函数的新增的C文件加入到编译脚本中,则可将Lua脚本使用的第三方C模块嵌入到应用程序中。

说明书 :

使用Lua脚本和第三方C模块的应用程序的编译方法

技术领域

[0001] 本发明涉及跨平台的应用程序的编译方法,尤其涉及一种使用Lua脚本和第三方C模块的应用程序的编译方法。

背景技术

[0002] Lua作为一种小巧的嵌入式脚本语言,由于它速度快且具有非常好的扩展性,这使得它在应用程序中可以被广泛使用。Lua自身并没有提供强大的库,所以在开发应用程序时往往需要引入第三方C模块对已有功能进行扩展和优化。
[0003] 第三方C模块一般都是以动态链接库的形式存在,当应用程序执行Lua脚本时,会去查找相应C模块的动态链接库并加载。这种加载方式在大部分系统中都没有问题。
[0004] 但是在有些系统中,应用程序的动态链接库查找路径会存在限制,或是系统会对应用程序加载动态链接库的行为做安全管控。要让使用Lua脚本和第三方C模块的应用程序在这种系统上正常运行,那么必然要花费很多时间进行适配,且存在着时间不确定的风险。如果类似需要适配的系统较多的话,那将极大的增加开发成本。

发明内容

[0005] 鉴于目前现有技术的不足,本发明的目的在于提供一种使用Lua脚本和第三方C模块的应用程序的编译方法,可以快速、方便的完成,提高效率,降低成本。
[0006] 为达到上述目的,本发明的实施例采用如下技术方案:
[0007] 一种使用Lua脚本和第三方C模块的应用程序的编译方法,包括以下步骤:
[0008] 将Lua脚本使用的第三方C模块编译为静态链接库,获得静态链接库的名称列表;
[0009] 解析Lua脚本,获取Lua脚本使用的第三方C模块(即静态链接库)的名称以及相应模块加载接口函数名称的对应列表;
[0010] 通过初始化函数,将Lua脚本使用的第三方C模块(即静态链接库)嵌入到应用程序中进行编译,实现静态调用。
[0011] 进一步,其中所述将Lua脚本使用的第三方C模块编译为静态链接库,获得静态链接库的名称列表,该步骤具体包括:
[0012] S1,将Lua脚本使用的第三方C模块编译为静态链接库;
[0013] S2,获取所述静态链接库的名称,得到静态链接库的名称列表。
[0014] 进一步,其中所述S1,将Lua脚本使用的第三方C模块编译为静态链接库,使用ar工具打包成.a文件。
[0015] 进一步,其中所述S2,获取所述静态链接库的名称,得到静态链接库的名称列表,是通过find和sed等工具遍历所述静态链接库所在的目录并取出静态链接库的名称。
[0016] 进一步,其中所述解析Lua脚本,获取Lua脚本使用的第三方C模块也即静态链接库的名称以及相应模块加载接口函数名称的对应列表,该步骤具体包括:
[0017] S3,解析Lua脚本,获取Lua脚本使用的第三方C模块的名称列表;
[0018] S4,根据Lua解释器中C模块接口函数的命名格式,获取C模块中开放的模块加载接口函数名称;
[0019] S5,解析完Lua脚本后,获得静态链接库的Lua脚本使用的第三方C模块的名称与模块加载接口函数名称的对应列表。
[0020] 进一步,其中所述S3,解析Lua脚本,获取Lua脚本使用的第三方C模块的名称列表,是解析Lua脚本中的require功能模块,根据所述步骤S2中所述静态链接库也即所述第三方C模块的名称列表,判断require的模块是否是第三方C模块或是其中一部分,如果是则记录该第三方C模块的名称。
[0021] 进一步,其中所述通过初始化函数,将Lua脚本使用的第三方C模块也即静态链接库嵌入到应用程序中进行编译,实现静态调用,该步骤具体包括:
[0022] S6,设定初始化函数,将Lua脚本使用的第三方C模块全部实现静态调用;
[0023] S7,在应用程序中调用所述初始化函数;
[0024] S8,编译应用程序,将Lua脚本使用的第三方C模块嵌入到应用程序中。
[0025] 进一步,其中所述S6,设定初始化函数,将Lua脚本使用的第三方C模块全部实现静态调用,通过初始化函数luaL_requiref以及所述Lua脚本使用的第三方C模块名称与模块加载接口函数名称的对应列表,自动动态生成,所述初始化函数存放在新增的C文件中。
[0026] 进一步,其中所述S7,在应用程序中调用所述初始化函数,是在应用程序中创建Lua虚拟机的代码后,调用所述初始化函数。
[0027] 进一步,其中所述S8,编译应用程序,将Lua脚本使用的第三方C模块嵌入到应用程序中,是将所述包含有初始化函数的新增的C文件加入到编译脚本中,则可将Lua脚本使用的第三方C模块嵌入到应用程序中。
[0028] 本发明的优点:本发明使用Lua脚本和第三方C模块的应用程序的编译方法通过将Lua脚本使用的C模块嵌入到应用程序进行编译,使得应用程序的编译方式可以通用化,无需再为跨平台的适配花费太多时间,同时还能做到让已存在的Lua脚本无需进行任何修改。这大大提高了开发效率,降低了开发成本。而且,其中步骤S2-S6是完全独立的部分,可以非常方便的集成到编译环境中。

附图说明

[0029] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0030] 图1为本发明所述的一种使用Lua脚本和第三方C模块的应用程序的编译方法的流程示意图。

具体实施方式

[0031] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0032] 请参见图1所示,本发明一实施方式使用Lua脚本和第三方C模块的应用程序的编译方法,包括以下步骤:
[0033] S1,将Lua脚本使用的第三方C模块编译为静态链接库。
[0034] 现有技术中一般是将Lua脚本使用的第三方C模块编译为运态链接库,例如使用gcc工具打包成.so文件;而本发明是将Lua脚本使用的第三方C模块编译为静态链接库,例如使用ar工具打包成.a文件。编译好的静态链接库存放在一个统一的目录下。
[0035] S2,获取所述静态链接库的名称,得到静态链接库的名称列表。
[0036] 获取所述静态链接库的名称,例如通过find和sed等工具遍历所述静态链接库所在的目录并取出静态链接库的名称,一般来说,所述静态链接库的名称就是所述Lua脚本使用的第三方C模块的名称。
[0037] 所述步骤S1和S2分开进行,这样的话,当新增了一个第三方模块后,所述步骤S2是完全不需要修改的。当然,所述步骤S1和S2也可以合并进行,统称为将Lua脚本使用的第三方C模块编译为静态链接库,获得静态链接库的名称列表。
[0038] S3,解析Lua脚本,获取Lua脚本使用的第三方C模块的名称列表。
[0039] 在Lua脚本中,一般会有许多应用功能模块,有的是自定义的,有的是第三方的。例如,解析Lua脚本中的require功能模块,根据所述步骤S2中所述静态链接库也即所述第三方C模块的名称列表,判断require的模块是否是第三方C模块或是其中一部分,如果是则记录该第三方C模块的名称。其中,所述require是模块Lua脚本中的内置函数,其作用就是表明要加载一个模块(类似于python中的import)。比如,require("cjson")或require("_openssl.cipher"),其中cjson就是一个完整的模块,而_openssl.cipher只加载了模块中的cipher部分(也可以理解为子模块)。
[0040] S4,根据Lua解释器中C模块接口函数的命名格式,获取C模块中开放的模块加载接口函数名称。
[0041] 根据所述记录的第三方C模块的名称以及Lua解释器中C模块接口函数的命名格式,即可很容易获得C模块中开放的模块加载接口函数名称。
[0042] S5,解析完Lua脚本后,获得第三方C模块也即静态链接库的名称与模块加载接口函数名称的对应列表。
[0043] 所述步骤S3-S5,统称为解析Lua脚本,获取Lua脚本使用的第三方C模块也即静态链接库的名称以及相应模块加载接口函数名称的对应列表。
[0044] S6,设定初始化函数,将Lua脚本使用的第三方C模块全部实现静态调用。
[0045] 初始化函数,例如是luaL_requiref(L,模块名称,加载接口函数,0),通过所述Lua脚本使用的第三方C模块名称与模块加载接口函数名称的对应列表,可以自动动态生成。所述初始化函数存放在C文件中,所述C文件可以是原先存在的C文件,也可以是新增的C文件,新增的C文件操作上更方便。
[0046] S7,在应用程序中调用所述初始化函数。
[0047] 具体来说,在应用程序中创建Lua虚拟机的代码后,调用所述初始化函数。
[0048] S8,编译应用程序,将Lua脚本使用的第三方C模块嵌入到应用程序中。
[0049] 编译时,可将所述包含有初始化函数的新增的C文件加入到编译脚本中,则可将Lua脚本使用的第三方C模块嵌入到应用程序中。
[0050] 所述步骤S6-S8,统称通过初始化函数,将Lua脚本使用的第三方C模块也即静态链接库嵌入到应用程序中进行编译,实现静态调用。
[0051] 本发明使用Lua脚本和第三方C模块的应用程序的编译方法通过将Lua脚本使用的C模块嵌入到应用程序进行编译,使得应用程序的编译方式可以通用化,无需再为跨平台的适配花费太多时间,同时还能做到让已存在的Lua脚本无需进行任何修改。这大大提高了开发效率,降低了开发成本。而且,其中步骤S2-S6是完全独立的部分,可以非常方便的集成到编译环境中。
[0052] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本领域技术的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。