CN110457044B - Haxe应用程序的编译方法、装置及电子设备 - Google Patents
Haxe应用程序的编译方法、装置及电子设备 Download PDFInfo
- Publication number
- CN110457044B CN110457044B CN201910746613.2A CN201910746613A CN110457044B CN 110457044 B CN110457044 B CN 110457044B CN 201910746613 A CN201910746613 A CN 201910746613A CN 110457044 B CN110457044 B CN 110457044B
- Authority
- CN
- China
- Prior art keywords
- haxe
- compiling
- file
- library
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 210000000689 upper leg Anatomy 0.000 title claims abstract description 370
- 238000000034 method Methods 0.000 title claims abstract description 81
- 230000003068 static effect Effects 0.000 claims description 45
- 238000004590 computer program Methods 0.000 claims description 7
- 230000006870 function Effects 0.000 description 7
- 238000010276 construction Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 5
- 230000008569 process Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 230000002159 abnormal effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供了一种Haxe应用程序的编译方法、装置及电子设备,涉及计算机语言程序的技术领域,包括:获取至少一个Haxe程序库和扩展的Haxe编译器;利用扩展的Haxe编译器将Haxe程序库源代码进行编译,再将Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于配置项利用扩展的Haxe编译器对Haxe主程序进行编译,生成预设目标平台的可执行文件。本发明先对Haxe程序库进行编译,然后基于Haxe程序库的编译结果对Haxe主程序进行编译,在不引用Haxe程序库源代码的情况下完成Haxe应用程序的编译,提升编译速度,进而提高程序员的工作效率。
Description
技术领域
本发明涉及计算机语言程序技术领域,尤其是涉及一种Haxe应用程序的编译方法、装置及电子设备。
背景技术
目前,根据Haxe现有的构建流程,软件开发者在构建Haxe应用程序或Haxe程序库时,需要同时得到所有引用的Haxe程序库的源代码,否则无法完成构建。在实际的软件协同开发过程中,不同的Haxe程序库可能由不同的团队进行开发,团队之间可能基于各种原因(如保密原因),不便于将本团队开发的Haxe程序库源代码直接公开给其他团队的软件开发者;而且,将所有Haxe源代码进行一次性编译的构建方法,编译速度会比较慢,表现在工作效率上为低效。
发明内容
本发明的目的在于提供一种Haxe应用程序的编译方法、装置及电子设备,提升编译速度,进而提高程序员的工作效率。
本发明提供的一种Haxe应用程序的编译方法,其中,包括:获取至少一个Haxe程序库和扩展的Haxe编译器;利用所述扩展的Haxe编译器将所述Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果;将所述Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于所述配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述预设目标平台的可执行文件。
进一步的,所述Haxe程序库编译结果包括:第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件;其中,所述第二Haxe头文件与所述C++头文件一一对应。
进一步的,利用所述扩展的Haxe编译器将所述Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果包括:获取第一Haxe程序库编译配置文件;根据所述Haxe程序库在所述第一Haxe程序库编译配置文件中添加库配置项,得到第二Haxe程序库编译配置文件;其中,所述Haxe程序库与所述库配置项一一对应;基于所述第二Haxe程序库编译配置文件,利用所述扩展的Haxe编译器将所述Haxe程序库源代码编译成第一C++源代码,并生成第一配置文件、所述第一Haxe头文件、第二Haxe头文件和所述C++头文件;基于所述第一配置文件,利用所述扩展的Haxe编译器调用Hxcpp对所述第一C++源代码进行编译,生成所述静态链接库文件;将所述第一Haxe头文件、所述第二Haxe头文件、所述C++头文件和所述静态链接库文件作为预设目标平台的Haxe程序库编译结果。
进一步的,将所述Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于所述配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述预设目标平台的可执行文件包括:获取Haxe主程序源代码;将所述第一Haxe头文件、所述第二Haxe头文件、所述C++头文件和所述静态链接库文件分别设置为Haxe主程序的编译配置文件中的第一配置项、第二配置项、第三配置项和第四配置项;基于所述第一配置项和所述第二配置项,利用所述扩展的Haxe编译器将所述Haxe主程序源代码转换成第二C++源代码,同时生成第二配置文件;基于所述第三配置项和所述第二配置文件,利用所述扩展的Haxe编译器调用Hxcpp对所述第二C++源代码进行编译,生成Haxe主程序的二进制对象文件;利用所述扩展的Haxe编译器调用Hxcpp将所述二进制对象文件与所述第四配置项进行链接,生成所述预设目标平台的可执行文件。
进一步的,所述第二Haxe程序库编译配置文件包括宏定义,所述扩展的Haxe编译器通过增加接口以支持所述宏定义。
进一步的,所述方法还包括:所述Haxe程序库源代码中的方法若被外部程序库重写,则对所述扩展的Haxe编译器添加第一新增类型元数据。
进一步的,所述第一Haxe头文件中的Haxe类型声明包括第二新增类型元数据。
进一步的,所述Haxe主程序的编译配置文件包括启动项。
本发明提供的一种Haxe应用程序的编译装置,其中,包括:获取模块,用于获取至少一个Haxe程序库和扩展的Haxe编译器;第一编译模块,用于利用所述扩展的Haxe编译器将所述Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果;第二编译模块,用于将所述Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于所述配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述预设目标平台的可执行文件。
本发明还提供一种电子设备,包括存储器、处理器,所述存储器中存储有可在所述处理器上运行的计算机程序,其中,所述处理器执行所述计算机程序时实现所述的方法。
本发明提供了一种Haxe应用程序的编译方法、装置及电子设备,包括:获取至少一个Haxe程序库和扩展的Haxe编译器;利用扩展的Haxe编译器将Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果;将Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述目标平台的可执行文件。本发明将Haxe程序库的编译和Haxe主程序的编译分离,先对Haxe程序库进行编译,然后基于Haxe程序库的编译结果对Haxe主程序进行编译,在不引用Haxe程序库源代码的情况下完成Haxe应用程序的编译,提升编译速度,进而提高程序员的工作效率。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种Haxe应用程序的编译方法的流程图;
图2为图1中步骤S102的流程图;
图3为图1中步骤S103的流程图;
图4为本发明实施例提供的一种Haxe应用程序的编译装置的结构图。
图标:
11-获取模块;12-第一编译模块;13-第二编译模块。
具体实施方式
下面将结合实施例对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
目前,将所有Haxe程序库源代码进行一次性编译的构建方法,编译速度会比较慢,表现在工作效率上比较低效,且Haxe本身并没有就此提供任何相关的解决方案。基于此,本发明实施例提供了一种Haxe应用程序的编译方法、装置及电子设备,可以在保证各个Haxe程序库的开发者不需要对外提供源代码的前提条件下,仅依赖其Haxe程序库的Haxe应用程序或其他Haxe程序库就可以完成编译。
实施例一:
为便于对本实施例进行理解,首先对本发明实施例所公开的一种Haxe应用程序的编译方法进行详细介绍,参照图1,所述Haxe应用程序的编译方法可以包括以下步骤:
步骤S101,获取至少一个Haxe程序库和扩展的Haxe编译器。
在本发明实施例中,软件开发者利用Haxe语言开发Haxe程序库时,除了编写Haxe程序库源代码以外,可能还会引用外部的Haxe程序库。现有Haxe编译器并不能支持本发明实施例的全部功能,所支持的功能例如:支持生成静态链接库文件,不支持的功能例如静态链接库文件只与非Haxe语言编写的主程序进行链接、运行,即静态链接库文件不能应用到Haxe主程序中。为了使Haxe编译器能够将静态链接库文件应用到Haxe主程序中,本发明实施例可对Haxe编译器预先进行扩展,得到扩展的Haxe编译器。
步骤S102,利用扩展的Haxe编译器将Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果。
在本发明实施例中,Haxe方便构建具有跨平台特性的、运行于预设目标平台的应用程序,其中,预设目标平台包括但不限于Windows操作系统、浏览器Web页面和Android操作系统。Haxe程序库编译结果可以包括:第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件;其中,第二Haxe头文件与C++头文件一一对应。其中,静态链接库文件属于本地静态链接库,本地静态链接库即为基于预设目标平台原生环境的静态链接库。例如:若预设目标平台为Windows操作系统,则静态链接库文件对应为文件名后缀为.lib的文件;若预设目标平台为Web平台的WebAssembly,则静态链接库文件对应为文件名后缀为.a的文件。
步骤S103,将Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于配置项利用扩展的Haxe编译器对Haxe主程序进行编译,生成预设目标平台的可执行文件。
在本发明实施例中,将Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,其目的在于利用Haxe程序库编译结果实现对Haxe程序库的使用,同时又不需要引用Haxe程序库源代码,保护了Haxe程序库开发者的合法权利。Haxe主程序的编译配置文件中的配置项除了包括Haxe程序库编译结果,还包括其他的配置项,例如,配置项exclude2,exclude2是一个名称,指示Haxe编译器在编译Haxe源代码时先执行一段exclude2的Haxe代码,而上述Haxe代码并不出现在Haxe主程序的配置文件中。需要注意的是,Haxe是一种开源代码工具包,包括Haxe编程语言、Haxe编译器、Haxe标准库。
本发明实施例获取的扩展的Haxe编译器支持对Haxe程序库和Haxe主程序分别进行编译,先把Haxe程序库编译成预设目标平台的C++静态链接库文件;然后基于静态链接库文件与Haxe主程序进行链接,最终构建出预设目标平台的可执行文件。本发明实施例对Haxe程序库和Haxe主程序分别进行编译,可以提升得到预设目标平台的可执行文件的速度,进而提高程序员的工作效率。
进一步的,参照图2,步骤S102可以包括以下步骤:
步骤S201,获取第一Haxe程序库编译配置文件;
步骤S202,根据Haxe程序库在第一Haxe程序库编译配置文件中添加库配置项,得到第二Haxe程序库编译配置文件;其中,Haxe程序库与库配置项一一对应;
在本发明实施例中,配置项可以使第二Haxe程序库编译配置文件具有以下特征:保证Haxe程序库只生成与该库相关的源代码。
步骤S203,基于第二Haxe程序库编译配置文件,利用扩展的Haxe编译器将Haxe程序库源代码编译成第一C++源代码,并生成第一配置文件、第一Haxe头文件、第二Haxe头文件和C++头文件。
在本发明实施例中,第一C++源代码为Haxe程序库的C++源代码。第一Haxe头文件包括:Haxe类型声明和Haxe方法声明,同理,第二Haxe头文件包含的内容类型与第一Haxe头文件相同。第二Haxe程序库编译配置文件包括宏定义,扩展的Haxe编译器通过增加接口以支持宏定义。第一配置文件与第一C++源代码对应。第一Haxe头文件中的Haxe类型声明包括第二新增类型元数据。第二新增类型元数据使扩展的Haxe编译器具有在编译Haxe主程序时可以使用Haxe程序库,且不生成Haxe程序库的C++源代码的功能。
在实际应用中,为了达到可以将Haxe程序库应用于Haxe主程序的目的,可以对Haxe编译器做一系列的修改,得到扩展的Haxe编译器。为了满足实际应用,扩展的Haxe编译器至少具有以下特征:特征一,保证Haxe程序库只生成与该库相关的源代码;特征二,保证Haxe程序库的Haxe头文件和C++头文件的对应关系;特征三,保证Haxe库的Haxe方法被外部重写,但对应的C++方法不是virtual的问题;特征四,保证Haxe库的类型初始化正常;特征五,支持将Haxe程序库的C++头文件和静态链接库文件传递给编译主程序的hxcpp编译器。
在步骤S203中,先对扩展的Haxe编译器的前两个特征分别进行具体分析:
特征一,为了保证Haxe程序库只生成与该库相关的源代码,其中,源代码包括Haxe程序库的C++源代码、C++头文件、第一Haxe头文件和第二Haxe头文件,通过以下方法对Haxe编译器进行扩展,得到扩展的Haxe编译器:
(1)修改Haxe编译器,在Haxe编译器原有的MetaData(类型元数据)“hxGen”的基础上增加“hxGen2”的支持,hxGen2是对hxGen的改进和优化,且hxGen2的具体实现如下:假设某个名称为“class MyClass”的Haxe类型被设置了拥有类型元数据hxGen2,那么当Haxe编译器在进行“生成C++源代码”这一步骤遇到MyClass该Haxe类型时,则不生成MyClass对应的C++源代码、C++头文件以及Haxe头文件,但同时不影响其他Haxe源代码对MyClass的引用。
(2)修改Haxe编译器,以支持新增的名称为exclude2的配置项,指示Haxe编译器在编译Haxe源代码时先执行macro,其中,macro是Haxe的特有概念,本质是一段Haxe代码。在Haxe编译器开始编译之前的准备阶段执行,为了现场即时修改Haxe类型的源代码或者Haxe类型的元数据,在Haxe编译器原有接口Compiler.exclude()的基础上增加Compiler.exclude2(),其中,Compiler.exclude2()为名称为exclude2的macro的具体实现,该接口的输入参数是Haxe包名称,具体实现是对属于该Haxe包名称包含所有类型都为新增元数据hxGen2。exclude2的macro与hxGen2的metadata构成的方案,使得编译得到的静态链接库文件不包含该Haxe程序库以外的代码。
(3)修改Haxe编译器,同时在第一Haxe程序库编译配置文件基础上,增加若干个以下配置项:
—macro exclude2(‘MyPackageName’)
得到第二Haxe程序库编译配置文件,第二Haxe程序库编译配置文件可以使将包名称为“MyPackageName’的所有类型都设置为类型元数据hxGen2。其中,“MyPackageName”只是一个示例,在实际时需要根据Haxe程序库本身的实际情况来配置需要排除在编译之外的包名称。
特征二,为了解决Haxe程序库的第二Haxe头文件和C++头文件的对应关系,通过以下方法对Haxe编译器进行扩展,得到扩展的Haxe编译器:
修改Haxe编译器,使扩展的Haxe编译器在编译Haxe程序库(假设库名称为MyLib)时额外生成一个Haxe头文件(假定名称为MyLibLoader.hx),该hx文件包含一个Haxe方法addIncludeMeta(),该方法的具体功能是针对当前被编译的Haxe程序库下所有类型逐一增加类型元数据“@:include('XXX.h')”,示例如下:
Compiler.addMetadata("@:include('myPackage//MyClass.h')","mMyPackage.MyClass");
MyLibLoader.hx中的Haxe头文件是在编译当前Haxe程序库时生成的,然后提供给引用当前Haxe程序库的其他Haxe程序库或者Haxe主程序的编译配置文件使用的,具体使用方法是在编译配置文件增加一个配置项:--macro MyLibLoader.addIncludeMeta()。最终达到的效果是:只要引用了属于MyLib这个Haxe程序库的类型的Haxe代码文件,其对应的由Haxe编译器生成的第一C++源代码文件中,就会包含#include“XXX.h”这一行代码,最终目的是保证第一C++源代码文件在编译时能够找到相应的头文件以保证编译正确。
步骤S204,基于第一配置文件,利用扩展的Haxe编译器调用Hxcpp对第一C++源代码进行编译,生成静态链接库文件;
在本发明实施例中,第一C++源代码为C++源代码,hxcpp是一个与预设目标平台无关的用于编译C++源代码的“上层编译器”,hxcpp本身不直接提供编译和链接的实现,只是调用预设目标平台的编译工具链(如Windows的MSVC编译工具链、Emscripten编译工具链)来完成对C++源代码的编译器选项配置、编译和链接。需要注意的是,静态链接库文件理论上可以替换成动态链接库文件,但不能简单地替换。扩展的Haxe编译器支持在未引用Haxe程序库源代码的情况下对Haxe程序库的C++源代码进行编译,生成静态链接库文件。其中,原有Haxe编译器支持生成C++本地静态链接库,但这个静态链接库适合与非Haxe语言编写的主程序进行链接和运行,不能应用于Haxe应用程序,这是Haxe原生设计缺陷导致。为了达到可以将Haxe程序库应用于Haxe主程序,需要做一系列的修改,具体详情见本发明实施例中的上述多个特征。
步骤S205,将第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件作为预设目标平台的Haxe程序库编译结果。
在本发明实施例中,先对Haxe程序库源代码进行编译,得到与Haxe程序库源代码对应的第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件。第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件在对Haxe主程序进行编译时需要用到,因此将第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件作为预设目标平台的Haxe程序库编译结果,即预设目标平台的Haxe程序库编译结果可以为编译Haxe主程序做准备。也就是说,扩展的Haxe编译器在不需要引用Haxe程序库源代码的情况下,通过引用预设目标平台的Haxe程序库编译结果即可完成对Haxe主程序的编译,可以避免Haxe程序库源代码的泄露。
进一步的,方法还包括:Haxe程序库源代码中的方法若被外部程序库重写,则对扩展的Haxe编译器添加第一新增类型元数据。
在本发明实施例中,第一新增类型元数据可以指新增类型元数据forceVirtual。在实际应用中,扩展的Haxe编译器还具有上述特征三:为了保证Haxe库的Haxe方法被外部重写对应的C++方法是virtual。本发明实施例对扩展的Haxe编译器的特征三进行具体分析:
在现有Haxe编译器的基础上新增类型元数据forceVirtual,目的是指示扩展的Haxe编译器在将Haxe主程序源代码转换生成C++源代码时,凡是含有forceVirtual类型元数据的Haxe方法,对应生成的C++方法是Virutal方法。例如,某个Haxe方法配置了如下forceVirtual:
@:forceVirutal void myHaxeMethod(intparam);
那么,对应生成的C++方法将会是:
virtual void myHaxeMethod(intparam);
如果未采用本发明的方法对编译Haxe代码进行编译,在这种情况下编译Haxe程序库或者编译Haxe应用程序时,所有Haxe源代码(包含被引用的Haxe程序库在内),均作为Haxe编译器的输入,一次性提供给Haxe编译器进行编译,然后Haxe编译器会转换并输出对应的C++源代码,在这种情况下,被引用的Haxe程序库的C++源代码是即时现场生成的,Haxe编译器可以根据输入的所有Haxe源代码智能地分析出被引用的Haxe程序库中哪些Haxe方法被外部(当前Haxe程序库或Haxe应用程序)重写了,然后对被重写的Haxe方法进行转换成C++时,会自动转换为C++的virtual方法。而在配置了forceVirtual的本发明实施例中,Haxe编译器没办法提前预知哪个Haxe方法会被其他Haxe程序库或Haxe主程序所重写,被引用的Haxe程序库的C++源代码不是即时现场生成的,而是提前就转换生成好的,因为在生成C++源代码的时间点上,Haxe程序库先于Haxe主程序。因此,为了使Haxe编译器将某个Haxe方法转换成C++virtual方法,需要forceVirutal这个类型元数据提前配置好并告知Haxe编译器。其中,forceVirtual的metadata可以使扩展的Haxe编译器根据预设配置对受外部程序重写的Haxe方法生成正确的C++Virtual方法。
进一步的,参照图3,步骤S103可以包括以下步骤:
步骤S301,获取Haxe主程序源代码;
在本发明实施例中,Haxe主程序源代码中存在引用Haxe程序库的情况。
步骤S302,将第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件分别设置为Haxe主程序的编译配置文件中的第一配置项、第二配置项、第三配置项和第四配置项;
在本发明实施例中,Haxe主程序的编译配置文件还包括启动项。启动项可以指boot_all()。对扩展的Haxe编译器所具有的特征四进行如下具体分析:
修改Haxe编译器,使得Haxe主程序生成的boot_all()方法可以初始化被引用Haxe程序库的类型。
boot_all()是C++方法,由Haxe编译器根据主程序Haxe源代码生成,其目的是初始化所有的由Haxe类型转换而来的C++类型,boot_all的具体实现是逐一调用每个C++类的__register()或__boot()方法。
在采用本发明实施例的技术方案的情况下,现有的Haxe编译器对主程序生成的boot_all只会初始化Haxe主程序本身的类,而不会初始化主程序引用的外部的Haxe程序库的C++类,这就会造成主程序启动失败运行异常。为了使Haxe主程序也可以初始化所引用的Haxe程序库的C++类,需要修改Haxe编译器。现有的Haxe编译器在编译Haxe程序库时也会生成类似主程序一样的boot_all()方法,所以只需要将Haxe主程序的boot_all()方法调用Haxe程序库的boot_all()方法即可解决。
具体实现如下:
(1)修改Haxe编译器,使得在编译Haxe程序库时生成的boot_all方法的名称,改为专有的方法名称,例如boot_all_mylib(),这是为了避免跟主程序的boot_all()方法发生名字冲突。
(2)修改Haxe编译器,使扩展的Haxe编译器可以在Haxe主程序编译配置文件中将要引用的Haxe程序库的boot_all方法名称传递给Haxe编译器,以便在对Haxe主程序转换生成的boot_all()方法中,可以增加对Haxe程序库boot_all方法的调用,这样就可以实现对引用的Haxe程序库的C++类进行初始化的目的。
(3)修改Haxe编译器,以支持xxx_boot_all_func_name配置项。主程序的编译配置文件增加类似以下配置项:
-D mylib_boot_all_func_name=mylib_boot_all;
其中-D是Haxe编译器原生支持的,表示这是一个define(定义);mylib_boot_all_func_name是define的名称;mylib_boot_all是define的值。xxx_boot_all_func_name该配置项是本发明实施例新增的,其含义是告诉编译Haxe主程序的Haxe编译器,名称为mylib的Haxe程序库的boot_all方法名称是mylib_boot_all()。因此,xxx_boot_all_func_name配置项使扩展的Haxe编译器支持boot_all初始化所有C++类型。
步骤S303,基于第一配置项和第二配置项,利用扩展的Haxe编译器将Haxe主程序源代码转换成第二C++源代码,同时生成第二配置文件;
步骤S304,基于第三配置项和第二配置文件,利用扩展的Haxe编译器调用Hxcpp对第二C++源代码进行编译,生成Haxe主程序的二进制对象文件;
步骤S305,利用扩展的Haxe编译器调用Hxcpp将二进制对象文件与第四配置项进行链接,生成预设目标平台的可执行文件。
在本发明实施例中,第二C++源代码为Haxe主程序的C++源代码。扩展的Haxe编译器对Haxe主程序进行构建,构建过程包含生成Haxe主程序的C++源代码、编译Haxe主程序的C++源代码、链接引用的外部Haxe程序库的静态链接库文件三个步骤。其中“生成C++源代码”阶段会引用第一Haxe头文件、第二Haxe头文件以正确生成Haxe主程序的C++源代码,“编译C++代码”阶段会引用C++头文件以正确生成Haxe主程序的二进制对象文件,“链接本地静态链接库文件”阶段会将Haxe主程序的二进制对象文件和编译配置文件中设置的静态链接库文件链接,最后构建生成目标平台的可执行文件。
此外,对扩展的Haxe编译器所具有的特征五进行如下具体分析:
修改hxcpp,以支持将Haxe程序库的C++头文件和静态链接库文件传递给编译Haxe主程序的hxcpp编译器。实现思路是增加两个define配置项,一个是extern_include_dir,另外一个是extern_lib_file。其中extern_include_dir用于配置Haxe程序库的C++头文件,extern_lib_file用于配置Haxe程序库的C++静态链接库文件。hxcpp编译器是负责调用预设目标平台的编译工具链对C++进行编译和链接,具有上述两个define配置项的hxcpp可以将Haxe程序库的静态链接库链接到主程序的可执行文件中。
本发明实施例将Haxe程序库源代码和Haxe主程序源代码的编译工作分开处理,可以基于预设目标平台的Haxe程序库编译结果对Haxe主程序源代码进行编译。与一次性编译的方法相比,本发明实施例不引用Haxe程序库源代码,且Haxe程序库源代码和Haxe主程序源代码的编译工作分开处理,因此可以保证编译速度快,表现在工作效率上为高效。Haxe应用程序需要引用某个Haxe程序库时,无需获取Haxe程序库完整的源代码,只需要Haxe程序库的头文件和二进制本地静态链接库文件即可完成构建。本发明实施例提高了修改Haxe主程序或Haxe程序库后编译应用程序得到可执行文件的效率。
本发明实施例提供的一种Haxe应用程序的编译方法,包括:获取至少一个Haxe程序库和扩展的Haxe编译器;利用扩展的Haxe编译器将Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果;将Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述目标平台的可执行文件。本发明实施例将Haxe程序库的编译和Haxe主程序的编译分离,先对Haxe程序库进行编译,然后基于Haxe程序库的编译结果对Haxe主程序进行编译,在不引用Haxe程序库源代码的情况下完成Haxe应用程序的编译,提升编译速度,进而提高程序员的工作效率。
实施例二:
参照图4,本发明实施例提供一种Haxe应用程序的编译装置,用于实现Haxe应用程序的编译方法,该装置可以包括以下模块:
获取模块11,用于获取至少一个Haxe程序库和扩展的Haxe编译器;
第一编译模块12,用于利用扩展的Haxe编译器将Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果;
第二编译模块13,用于将Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于配置项利用扩展的Haxe编译器对Haxe主程序进行编译,生成预设目标平台的可执行文件。
本发明实施例提供的一种Haxe应用程序的编译装置,包括:获取模块,第一编译模块和第二编译模块,上述模块用于实现Haxe应用程序的编译方法。本发明实施例将Haxe程序库的编译和Haxe主程序的编译分离,先对Haxe程序库进行编译,然后基于Haxe程序库的编译结果对Haxe主程序进行编译,在不引用Haxe程序库源代码的情况下完成Haxe应用程序的编译,提升编译速度,进而提高程序员的工作效率。
进一步的,第一编译模块12可以包括以下单元:
第一获取单元,用于获取第一Haxe程序库编译配置文件;
添加单元,用于根据Haxe程序库在第一Haxe程序库编译配置文件中添加库配置项,得到第二Haxe程序库编译配置文件;其中,Haxe程序库与库配置项一一对应;
第一编译单元,用于基于第二Haxe程序库编译配置文件,利用扩展的Haxe编译器将Haxe程序库源代码编译成第一C++源代码,并生成第一配置文件、第一Haxe头文件、第二Haxe头文件和C++头文件;
第二编译单元,用于基于第一配置文件,利用扩展的Haxe编译器调用Hxcpp对第一C++源代码进行编译,生成静态链接库文件;
组合单元,用于将第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件作为预设目标平台的Haxe程序库编译结果。
进一步的,第二编译模块13可以包括以下单元:
第二获取单元,用于获取Haxe主程序源代码;
设置单元,用于将第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件分别设置为Haxe主程序的编译配置文件中的第一配置项、第二配置项、第三配置项和第四配置项;
生成单元,用于基于第一配置项和第二配置项,利用扩展的Haxe编译器将Haxe主程序源代码转换成第二C++源代码,同时生成第二配置文件;
第三编译单元,用于基于第三配置项和第二配置文件,利用扩展的Haxe编译器调用Hxcpp对第二C++源代码进行编译,生成Haxe主程序的二进制对象文件;
链接单元,用于利用扩展的Haxe编译器调用Hxcpp将二进制对象文件与第四配置项进行链接,生成预设目标平台的可执行文件。
进一步的,所述装置还包括:添加模块,添加模块用于所述Haxe程序库源代码中的方法若被外部程序库重写,则对所述扩展的Haxe编译器添加第一新增类型元数据。
本发明实施例还提供一种电子设备,包括存储器、处理器,所述存储器中存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法实施例一中所述方法的步骤。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
附图中的流程图和框图显示了根据本发明的多个实施例的方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
Claims (9)
1.一种Haxe应用程序的编译方法,其特征在于,包括:
获取至少一个Haxe程序库和扩展的Haxe编译器;所述扩展的Haxe编译器用于将静态链接库文件应用到Haxe主程序中;
利用所述扩展的Haxe编译器将所述Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果;所述预设目标平台包括但不限于:Windows操作系统、浏览器Web页面和Android操作系统;所述Haxe程序库编译结果包括:第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件;其中,所述第二Haxe头文件与所述C++头文件一一对应;
将所述Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于所述配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述预设目标平台的可执行文件。
2.根据权利要求1所述的方法,其特征在于,利用所述扩展的Haxe编译器将所述Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果包括:
获取第一Haxe程序库编译配置文件;
根据所述Haxe程序库在所述第一Haxe程序库编译配置文件中添加库配置项,得到第二Haxe程序库编译配置文件;其中,所述Haxe程序库与所述库配置项一一对应;
基于所述第二Haxe程序库编译配置文件,利用所述扩展的Haxe编译器将所述Haxe程序库源代码编译成第一C++源代码,并生成第一配置文件、所述第一Haxe头文件、第二Haxe头文件和所述C++头文件;
基于所述第一配置文件,利用所述扩展的Haxe编译器调用Hxcpp对所述第一C++源代码进行编译,生成所述静态链接库文件;
将所述第一Haxe头文件、所述第二Haxe头文件、所述C++头文件和所述静态链接库文件作为预设目标平台的Haxe程序库编译结果。
3.根据权利要求2所述的方法,其特征在于,将所述Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于所述配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述预设目标平台的可执行文件包括:
获取Haxe主程序源代码;
将所述第一Haxe头文件、所述第二Haxe头文件、所述C++头文件和所述静态链接库文件分别设置为Haxe主程序的编译配置文件中的第一配置项、第二配置项、第三配置项和第四配置项;
基于所述第一配置项和所述第二配置项,利用所述扩展的Haxe编译器将所述Haxe主程序源代码转换成第二C++源代码,同时生成第二配置文件;
基于所述第三配置项和所述第二配置文件,利用所述扩展的Haxe编译器调用Hxcpp对所述第二C++源代码进行编译,生成Haxe主程序的二进制对象文件;
利用所述扩展的Haxe编译器调用Hxcpp将所述二进制对象文件与所述第四配置项进行链接,生成所述预设目标平台的可执行文件。
4.根据权利要求2所述的方法,其特征在于,所述第二Haxe程序库编译配置文件包括宏定义,所述扩展的Haxe编译器通过增加接口以支持所述宏定义。
5.根据权利要求2所述的方法,其特征在于,所述方法还包括:所述Haxe程序库源代码中的方法若被外部程序库重写,则对所述扩展的Haxe编译器添加第一新增类型元数据。
6.根据权利要求1所述的方法,其特征在于,所述第一Haxe头文件中的Haxe类型声明包括第二新增类型元数据。
7.根据权利要求1所述的方法,其特征在于,所述Haxe主程序的编译配置文件包括启动项。
8.一种Haxe应用程序的编译装置,其特征在于,包括:
获取模块,用于获取至少一个Haxe程序库和扩展的Haxe编译器;所述扩展的Haxe编译器用于将静态链接库文件应用到Haxe主程序中;
第一编译模块,用于利用所述扩展的Haxe编译器将所述Haxe程序库源代码进行编译,得到预设目标平台的Haxe程序库编译结果;所述预设目标平台包括但不限于:Windows操作系统、浏览器Web页面和Android操作系统;所述Haxe程序库编译结果包括:第一Haxe头文件、第二Haxe头文件、C++头文件和静态链接库文件;其中,所述第二Haxe头文件与所述C++头文件一一对应;
第二编译模块,用于将所述Haxe程序库编译结果设置为Haxe主程序的编译配置文件中的配置项,并基于所述配置项利用所述扩展的Haxe编译器对Haxe主程序进行编译,生成所述预设目标平台的可执行文件。
9.一种电子设备,包括存储器、处理器,所述存储器中存储有可在所述处理器上运行的计算机程序,其特征在于,处理器执行计算机程序时实现如权利要求1至7任一项所述的方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910603300 | 2019-07-04 | ||
CN2019106033001 | 2019-07-04 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110457044A CN110457044A (zh) | 2019-11-15 |
CN110457044B true CN110457044B (zh) | 2023-11-14 |
Family
ID=68486307
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910746613.2A Active CN110457044B (zh) | 2019-07-04 | 2019-08-13 | Haxe应用程序的编译方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110457044B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111596923B (zh) * | 2020-05-21 | 2024-02-23 | 广东三维家信息科技有限公司 | Haxe静态链接库构建方法、装置和电子设备 |
CN111880830B (zh) * | 2020-07-23 | 2022-10-11 | 中国航发控制系统研究所 | 分布式控制软件源代码的自动化编译链接和加载方法 |
CN112363729B (zh) * | 2020-11-23 | 2024-05-14 | 北京轩宇信息技术有限公司 | 用于静态分析的多编译器混合编译的监控方法及装置 |
CN113553071B (zh) * | 2021-07-16 | 2024-03-12 | 北京比特大陆科技有限公司 | 软件安装方法、计算机设备和存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101706737A (zh) * | 2009-12-18 | 2010-05-12 | 湖南大学 | 软硬件协同函数库的构造方法 |
CN103279356A (zh) * | 2013-06-04 | 2013-09-04 | 百度在线网络技术(北京)有限公司 | Makefile文件的自动生成方法和装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101697135B (zh) * | 2009-10-28 | 2012-06-27 | 东方网力科技股份有限公司 | 一种编译程序的方法及装置 |
US10303466B1 (en) * | 2016-09-07 | 2019-05-28 | Amazon Technologies, Inc. | Semantic annotations in source code |
CN108563448B (zh) * | 2018-04-19 | 2021-08-17 | 图灵人工智能研究院(南京)有限公司 | 程序文件的编译方法、系统、计算机设备和存储介质 |
-
2019
- 2019-08-13 CN CN201910746613.2A patent/CN110457044B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101706737A (zh) * | 2009-12-18 | 2010-05-12 | 湖南大学 | 软硬件协同函数库的构造方法 |
CN103279356A (zh) * | 2013-06-04 | 2013-09-04 | 百度在线网络技术(北京)有限公司 | Makefile文件的自动生成方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110457044A (zh) | 2019-11-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110457044B (zh) | Haxe应用程序的编译方法、装置及电子设备 | |
CN110096338B (zh) | 智能合约执行方法、装置、设备及介质 | |
US20210073015A1 (en) | Java native interface and windows universal app hooking | |
US10146515B1 (en) | Live code updates | |
KR101137126B1 (ko) | 확장성 컴파일러 및 툴의 기반 구조에 대한 기술 언어 | |
US7131111B2 (en) | Development of manifest for java embedded server bundle | |
US20060064677A1 (en) | Debugger and method for debugging computer programs across multiple programming languages | |
US20040230958A1 (en) | Compiler and software product for compiling intermediate language bytecodes into Java bytecodes | |
US9047101B2 (en) | Method for compiling an intermediate code of an application | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
WO2016163901A1 (en) | An apparatus for processing an abstract syntax tree being associated with a source code of a source program | |
JP2022031507A (ja) | ディープラーニングフレームワークにおける演算子の展開方法、展開装置及び電子機器 | |
Hong et al. | The application guide of mixed programming between MATLAB and other programming languages | |
KR19980086685A (ko) | 원격으로 오브젝트를 실행하는 방법 | |
CN102402427A (zh) | 一种Java应用程序的更新方法及装置 | |
WO2019005228A1 (en) | AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM | |
KR20110045853A (ko) | 전산기기 소프트웨어 테스트 방법 및 시스템 | |
US6314557B1 (en) | Hybrid computer programming environment | |
CN114115964B (zh) | 一种用于Unity的热更新方法、装置、计算设备及计算机可读存储介质 | |
US20100083238A1 (en) | Binary manipulation of intermediate-language code | |
US8365154B2 (en) | Multi-language software development | |
Moron et al. | Support for Just-in-Time Compilation of WebAssembly for Embedded Systems | |
CN114546515B (zh) | 动态加载静态库的模块、固件及设备和C库转Lua库的方法 | |
CN103631585A (zh) | 一种用于开发应用程序的方法及系统 | |
CN114168151B (zh) | 基于容器的程序编译方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |