[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

CN109614106B - 一种c++程序编译方法和装置 - Google Patents

一种c++程序编译方法和装置 Download PDF

Info

Publication number
CN109614106B
CN109614106B CN201811569117.6A CN201811569117A CN109614106B CN 109614106 B CN109614106 B CN 109614106B CN 201811569117 A CN201811569117 A CN 201811569117A CN 109614106 B CN109614106 B CN 109614106B
Authority
CN
China
Prior art keywords
cpp
file
node
compiling
abstract syntax
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
Application number
CN201811569117.6A
Other languages
English (en)
Other versions
CN109614106A (zh
Inventor
郭凯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Longchuang Yuedong Network Technology Co ltd
Original Assignee
Beijing Longchuang Yuedong Network Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Longchuang Yuedong Network Technology Co ltd filed Critical Beijing Longchuang Yuedong Network Technology Co ltd
Priority to CN201811569117.6A priority Critical patent/CN109614106B/zh
Publication of CN109614106A publication Critical patent/CN109614106A/zh
Application granted granted Critical
Publication of CN109614106B publication Critical patent/CN109614106B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供一种C++程序编译方法,该方法包括获取多个cpp文件,并对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件,最后对所述目标cpp文件进行编译。该方法避免在对大量的cpp文件编译时,需要对每一个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的编译过程,直接对合并后的cpp文件进行统一的编译,节省了各种系统资源以及大量的时间开销和系统开销,加速了C++程序的编译进程,提高了系统的性能。

Description

一种C++程序编译方法和装置
技术领域
本发明涉及计算机技术领域,特别是涉及一种C++程序编译方法和装置。
背景技术
编译C++文件通常使用编译器,比如采用clang,gcc等C++编译器对其进行编译。在编译多个C++文件时,比如2000多个甚至更多个文件时,现有编译器是对C++文件逐个编译,这样会消耗大量的时间。C++编译器在编译文件的时候,每编译一个文件就会启动一个进程,加载各种系统资源会产生大量的时间开销和系统开销。
目前,对大量的C++文件进行编译,主要使用分布式编译技术,把C++文件发送到不同的机器进行编译,最后返回结果集成。这种方式需要第三方分布式软件的支持,并消耗大量的硬件环境,比如编译2000多个文件,至少需要10台机器,才能提高编译速度。
因此,在尽量节约硬件编译环境和编译时间开销的前提下,提高C++文件的编译速度是目前急需解决的技术问题。
发明内容
为了提高C++文件的编译速度,本发明提供了一种C++程序编译加速方法,以解决在尽量节约硬件编译环境和编译时间开销的前提下,提高C++文件编译速度的问题。该方法通过采用合并编译方式,将大量C++文件合并成一个文件,再对合并后的文件进行编译,这样就只需要加载一次系统资源,对C++文件进行集中编译,可极大的缩短编译时间。
该方法的具体技术方案如下:
一种C++程序编译方法,其特征在于,所述方法包括如下步骤:
获取多个cpp文件;
对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;
对所述目标cpp文件进行编译。
进一步地,对所述cpp文件进行合并算法处理,生成待编译的目标cpp文件之前,包括如下步骤:
将每个所述cpp文件生成抽象语法树;
判断所述抽象语法树之间是否包括相同的内部变量和/或函数。
进一步地,若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件。
进一步地,所述方法还包括,
若所述抽象语法树之间包括相同的内部变量和/或函数,则生成错误信息;
对所述错误信息进行修改;
其中,所述错误信息包括具有相同内部变量和/或函数的抽象对象树所对应的文件的文件名、内部变量名和/或函数名、所述内部变量名和/或函数名所在文件的行数。
进一步地,所述合并算法处理包括如下步骤:
采用include伪指令调用所述cpp文件;
将调用的所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。
进一步地,判断所述抽象语法树之间是否包括相同的内部变量和/或函数,具体包括如下步骤:
获取抽象语法树的节点信息;
遍历所述节点信息并判断其是否满足预设的判断条件;
若满足预设的判断条件,则判定所述抽象语法树之间包括相同的内部变量和/或函数。
本发明还提供一种C++程序编译装置,其特征在于,该装置包括,
获取模块,用于获取多个cpp文件;
合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;
编译模块,用于对所述目标cpp文件进行编译。
进一步地,所述合并算法处理模块还包括:
抽象语法树生成模块,用于对每个cpp文件生成抽象语法树;
判断模块,用于判断所述抽象语法树之间是否包括相同的内部变量和/或函数;
错误信息生成,用于在判断出所述抽象语法树之间包括相同的内部变量和/或函数时,生成错误信息;
错误修改模块,用于对所述错误信息进行修改,并生成新的抽象语法树。
进一步地,所述合并算法处理模块还包括,
include伪指令调用模块,用于调用获取的所述cpp文件;
cpp文件添加模块,用于将所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。
进一步地,所述判断模块还包括,
节点信息获取模块,用于获取所述抽象语法树中的节点信息;
节点信息判断模块,用于遍历所述节点信息并判断其是否满足预设的判断条件;若满足预设的判断条件,则判定所述抽象语法树之间包括相同的内部变量和/或函数。
本发明提供一种C++程序编译方法,该方法通过采用特定方法将大量的cpp文件合并成一个待编译的目标cpp文件,即先获取多个cpp文件,然后对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件,最后对合并后的目标cpp文件进行编译的方法,避免在对大量的cpp文件编译时,需要对每一个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对合并后的cpp文件进行统一的预处理、编译、汇编和产生目标链接的过程,完成C++程序的编译过程,系统进程从多次cpp文件编译过程变为一次性完成C++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了C++程序的编译进程,提高了系统性能。
进一步地,本发明提供的方法在对所述cpp文件进行合并算法处理,生成待编译的目标cpp文件之前,将每个cpp文件生成抽象语法树,该抽象语法树包括内部变量、内部函数等大量节点信息,对每个抽象语法树中的内部变量和内部函数等信息进行判断,判断抽象语法树之间是否包括相同的内部变量和/或函数。在生成待编译的目标cpp文件之前,对大量的cpp文件内包含的内部变量和函数进行分析判断,减少在对后来生成目标cpp文件时,由于cpp文件之间存在相同的内部变量和函数,使得编译过程中产生C++或者编译出现语法错误,需要反复对C++程序进行修改和编译,导致的编译效率降低的问题,本发明提供的方法能够减少该过程耗费的时间,提高编译的效率。
进一步地,本发明直接采用include伪指令调用所述cpp文件,将调用的所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件,程序性能得到很好的优化的同时,采用最为简便的伪指令调用方法,功能易实现,程序简单,且能实现较现有技术更好的效果。
本发明还提供一种C++程序编译装置,该装置包括,获取模块,用于获取多个cpp文件;合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;编译模块,用于对所述目标cpp文件进行编译。该装置通过获取模块获取多个cpp文件,由合并算法处理模块对获取的多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件,最后由编译模块对生成的目标cpp文件进行编译,避免在对大量的cpp文件编译时,需要对每个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对大量的cpp文件进行合并,并直接对合并后的算法进行统一的预处理、编译、汇编和产生目标链接的过程,完成C++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了C++程序的编译进程,提高了系统的性能。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1为本发明一种C++程序编译方法的流程示意图;
图2为本发明一种C++程序编译方法的一优选实施例的示意图;
图3为本发明一种C++程序编译装置的结构示意图;
图4为本发明一种C++程序编译装置的一优选结构示意图。
具体实施方式
下面结合附图,对本发明做进一步具体详细的描述。
参见图1,是本发明一种C++程序编译方法的流程示意图,该示意图包括如下步骤:
S1. 获取多个cpp文件;
S2. 对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;
S3. 对所述目标cpp文件进行编译。
上述步骤S1,获取多个cpp文件,本发明通过打开编译系统载入预先建立的C++开发工程,当编译系统运行程序时,使用文件遍历系统函数readdir,对预先建立的C++开发工程中的目录进行递归遍历,查找以cpp为后缀名的文件,获取所述多个cpp文件,并将获取的、用以表示该cpp文件的文件名存入到预先设置的变量中,例如,变量名为filelists,变量的类型为vector<string>。
上述步骤S2,对获取到的多个cpp文件,可以直接采用合并算法处理,生成待编译的目标cpp文件。需要说明的是,本发明所述合并算法处理可以是手动将多个cpp文件编辑到一个预先设置的文件中,并将该文件作为待编译的目标cpp文件。优选地,本发明将获取到的所述多个cpp文件采用伪指令include将其调用,然后将调用的cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。
上述步骤S3,对所述目标cpp文件进行编译。在本发明中,在clang编译平台上,对生成的目标cpp文件进行编译。
本发明提供一种C++程序编译方法,该方法通过采用特定方法将大量的cpp文件合并成一个待编译的目标cpp文件,即先获取多个cpp文件,然后对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件,最后对合并后的目标cpp文件进行编译的方法,避免在对大量的cpp文件编译时,需要对每一个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对合并后的cpp文件进行统一的预处理、编译、汇编和产生目标链接的过程,完成C++程序的编译过程,系统进程从多次cpp文件编译过程变为一次性完成C++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了C++程序的编译进程,提高了系统性能。
参见图2,是本发明一种C++程序编译方法的一优选的实施方式。
该方法包括:
L1:获取多个cpp文件;
L2:将每个所述cpp文件生成抽象语法树,获得内部变量和函数;
L3:判断所述抽象语法树之间是否包括相同的内部变量和/或函数;
L4:若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;
L5:对所述目标cpp文件进行编译。
步骤L1:本发明通过打开编译系统载入预先建立的C++工程,当编译系统运行程序时,使用文件遍历系统函数readdir,对预先建立的C++开发工程中的目录进行递归遍历,查找以cpp为后缀名的文件,获取多个cpp文件,并将获取的、用以表示该文件的文件名存入到预先设置的变量中,例如,变量名为filelists,变量类型为vector<string>。
步骤L2:获取到多个cpp文件后,首先构造一个全局变量,该全局变量用以存放变量或者函数的名字;然后引入clang SDK,调用clang SDK中集成的抽象语法树函数clang_parseTranslationUnit对获取的cpp文件进行算法处理,生成抽象语法树。需要说明的是,抽象语法树是源代码的抽象语法结构的树状表现形式,树上有众多节点,每个节点都表示源代码中的一种结构,包含内部变量和内部函数。
步骤L3:判断所述抽象语法树之间是否包括相同的内部变量和/或函数;遍历生成的多个抽象语法树,查找其中的内部变量和函数,并记录其名字。具体过程如下:
若成功生成C++的抽象语法树之后,调用clang_getTranslationUnitCursor方法,获得抽象语法树的遍历游标cursor;调用函数clang_visitChildren使用cursor遍历语法树的每一个节点,对每个节点调用clang_getCursorKind函数,获取节点类型nodetype,再调用clang_getCursorLinkage获取节点链接类型nodelinktype;若nodetype是CXCursor_FunctionDecl或者CXCursor_VarDecl,并且nodelinktype是CXLinkage_Internal这种类型。我们认为该节点是内部变量或者内部函数。若发现该节点是内部变量或者内部函数,调用方法clang_getCursorSpelling获取该节点的名字,即变量或者方法名字,叫做VariableOrMethodName, 再调用方法clang_getCursorLocation方法获取节点位置信息,然后使用clang_getExpansionLocation和clang_getFileName方法,获取节点所在的文件cpp文件名CppFileName,行号Row,列号Column。我们将这些信息存储到变量m_variables中,以VariableOrMethodName为key,以cpp filename为子key,以行号和列号为值,即:
m_variables[VariableOrMethodName][CppFileName]=“Row Column”
对m_variables进行遍历,若它的每一个键值对variableElement的子键的数量大于1,则说明有重复出现的变量或者函数名。即判断variableElement.size() > 1的情况下,就说明出现了相同的内部变量或者函数名。若出现大于1的情况,我们遍历variableElement,将它的每一个键值输出打印出来,其键为cpp文件名CppFileName,值为行号row和列号column。
综上所述,即获取抽象语法树的节点信息,所述节点信息包括函数、内部变量;遍历节点信息并判断节点信息是否满足上述的预设判断条件,若满足上述预设的判断条件,则判定抽象语法树之间包括相同的内部变量和/或函数。
L4:若上述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;
L5:对所述目标cpp文件进行编译。在本发明中,在clang编译平台上,对生成的目标cpp文件进行编译。
需要说明的是,本发明还包括步骤L4,若判断出所述抽象语法树之间包括相同的内部变量和/或函数,则生成错误信息;并对错误信息进行修改,直至再次对所述抽象语法树之间的内部变量和/或函数进行相同判断时,抽象语法树之间不再出现相同的内部变量和/或函数,则采用将多个cpp文件调用include伪指令合并处理到一个cpp文件中,并将此cpp文件作为目标cpp文件,最后再对合并后的目标cpp文件进行编译;其中,所述错误信息包括具有相同内部变量和/或函数的抽象对象树所对应的文件的文件名、内部变量名和/或函数名、所述内部变量名和/或函数名所在文件的行数。
本发明提供一种C++程序编译方法,该方法通过采用特定方法将大量的cpp文件合并成一个待编译的目标cpp文件,即先获取多个cpp文件,然后将每个cpp文件生成抽象语法树,该抽象语法树包括内部变量、内部函数等大量节点信息,对每个抽象语法树中的内部变量和内部函数等信息进行判断,判断抽象语法树之间是否包括相同的内部变量和/或函数。若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;最后对合并后的目标cpp文件进行编译处理,完成C++程序的编译。在生成待编译的目标cpp文件之前,对大量的cpp文件内包含的内部变量和函数进行分析判断,减少在对后来生成目标cpp文件时,由于cpp文件之间存在相同的内部变量和函数,使得编译过程中产生C++或者编译出现语法错误,需要反复对C++程序进行修改和编译,导致的编译效率降低的问题,本发明提供的方法能够减少该过程耗费的时间,提高编译的效率。同时,本发明对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件,最后对合并后的目标cpp文件进行编译的方法,避免在对大量的cpp文件编译时,需要对每一个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对合并后的cpp文件进行统一的预处理、编译、汇编和产生目标链接的过程,完成C++程序的编译过程,系统进程从多次cpp文件编译过程变为一次性完成C++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了C++程序的编译进程,提高了系统性能。
进一步地,本发明直接采用include伪指令调用所述cpp文件,将调用的所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件,程序性能得到很好的优化的同时,采用最为简便的伪指令调用方法,功能易实现,程序简单,且能实现较现有技术更好的效果。
参见图3,本发明还提供一种C++程序编译装置,该装置包括,获取模块,用于获取多个cpp文件;合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;编译模块,用于对所述目标cpp文件进行编译。
本发明该通过打开编译系统载入预先建立的C++开发工程,当编译系统运行程序时,该装置的获取模块获取多个cpp文件,并调用文件遍历系统函数readdir,对预先建立的C++开发工程中的目录进行递归遍历,查找以cpp为后缀名的文件,获取所述多个cpp文件,并将获取的、用以表示该cpp文件的文件名存入到预先设置的变量中,例如,变量名为filelists,变量的类型为vector<string>。合并算法处理模块对获取到的多个cpp文件,可以直接采用合并算法处理,生成待编译的目标cpp文件。需要说明的是,本发明所述的合并算法处理模块可以是手动将多个cpp文件编辑到一个预先设置的文件中,并将该文件作为待编译的目标cpp文件。优选地,本发明将获取到的所述多个cpp文件采用伪指令include将其调用,然后将调用的cpp文件添加至预先设置的cpp文件,生成待编译的目标文件。最后在clang编译平台上,编译模块将生成的目标cpp文件进行编译。
参见图4,是本发明一种C++程序编译装置的一优选实施方式。该装置包括,获取模块,用于获取多个cpp文件;合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;编译模块,用于对所述目标cpp文件进行编译。
该装置通过获取模块获取多个cpp文件,由合并算法处理模块对获取的多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件,最后由编译模块对生成的目标cpp文件进行编译,避免在对大量的cpp文件编译时,需要对每个cpp文件都进行单独的预处理、编译、汇编和产生目标链接的过程,而直接对大量的cpp文件进行合并,并直接对合并后的算法进行统一的预处理、编译、汇编和产生目标链接的过程,完成C++程序的编译过程,节省了各种系统资源以及大量的时间开销和系统开销,加速了C++程序的编译进程,提高了系统的性能。
进一步地,其中,合并算法处理模块还包括:
抽象语法树生成模块,用于对每个cpp文件生成抽象语法树;判断模块,用于判断所述抽象语法树之间是否包括相同的内部变量和/或函数;错误信息生成,用于在判断出所述抽象语法树之间包括相同的内部变量和/或函数时,生成错误信息;错误修改模块,用于对所述错误信息进行修改,并生成新的抽象语法树。合并算法处理模块还包括,include伪指令调用模块,用于调用获取的所述cpp文件;cpp文件添加模块,用于将所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。所述判断模块还包括,
节点信息获取模块,用于获取所述抽象语法树中的节点信息;节点信息判断模块,用于对所述节点信息进行判断。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如只读存储器(英文:read-only memory,ROM)/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如路由器等网络通信设备)执行本发明各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置统实施例仅仅是示意性的,其中作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本发明的优选实施方式,并非用于限定本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (4)

1.一种C++程序编译方法,其特征在于,所述方法包括如下步骤:
获取多个cpp文件;
对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;所述合并算法处理包括如下步骤:采用include伪指令调用所述cpp文件;将调用的所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件;
对所述目标cpp文件进行编译;
对所述cpp文件进行合并算法处理,生成待编译的目标cpp文件之前,包括如下步骤:
将每个所述cpp文件生成抽象语法树;判断所述抽象语法树之间是否包括相同的内部变量和/或函数,具体包括:获取抽象语法树的节点信息,所述节点信息包括:节点类型,节点链接类型,节点的名字,节点位置信息,节点所在的文件cpp文件名、行号及列号;遍历所述节点信息并判断其是否满足预设的判断条件;若满足预设的判断条件,则判定所述抽象语法树之间包括相同的内部变量和/或函数;若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;其中,判断节点信息是否满足预设的判断条件,包括:判断节点是否为内部变量或者内部函数;若是,根据所述节点信息确定所述节点的键值对,判断所述键值对的子键的数量是否满足大于1;其中,键值对以节点的名字为键,以节点的cpp文件名为子键,值为行号和列号。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括,
若所述抽象语法树之间包括相同的内部变量和/或函数,则生成错误信息;
对所述错误信息进行修改;
其中,所述错误信息包括具有相同内部变量和/或函数的抽象对象树所对应的文件的文件名、内部变量名和/或函数名、所述内部变量名和/或函数名所在文件的行数。
3.一种C++程序编译装置,其特征在于,该装置包括,
获取模块,用于获取多个cpp文件;
合并算法处理模块,用于对获取的所述多个cpp文件进行合并算法处理,并生成待编译的目标cpp文件;
编译模块,用于对所述目标cpp文件进行编译;
所述合并算法处理模块还包括:
抽象语法树生成模块,用于对每个cpp文件生成抽象语法树;
判断模块,用于判断所述抽象语法树之间是否包括相同的内部变量和/或函数;
所述判断模块还包括,
节点信息获取模块,用于获取所述抽象语法树中的节点信息;所述节点信息包括:节点类型,节点链接类型,节点的名字,节点位置信息,节点所在的文件cpp文件名、行号及列号;
节点信息判断模块,用于遍历所述节点信息并判断其是否满足预设的判断条件;若满足预设的判断条件,则判定所述抽象语法树之间包括相同的内部变量和/或函数;若所述抽象语法树之间不包括相同的内部变量和/或函数,则对所述多个cpp文件进行合并算法处理,生成待编译的目标cpp文件;其中,判断节点信息是否满足预设的判断条件,包括:判断节点是否为内部变量或者内部函数;若是,根据所述节点信息确定所述节点的键值对,判断所述键值对的子键的数量是否满足大于1;其中,键值对以节点的名字为键,以节点的cpp文件名为子键,值为行号和列号;
所述合并算法处理模块还包括,
include伪指令调用模块,用于调用获取的所述cpp文件;
cpp文件添加模块,用于将所述cpp文件添加至预先设置的cpp文件,生成待编译的目标cpp文件。
4.根据权利要求3所述的装置,其特征在于,所述合并算法处理模块还包括:
错误信息生成,用于在判断出所述抽象语法树之间包括相同的内部变量和/或函数时,生成错误信息;
错误修改模块,用于对所述错误信息进行修改,并生成新的抽象语法树。
CN201811569117.6A 2018-12-21 2018-12-21 一种c++程序编译方法和装置 Active CN109614106B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811569117.6A CN109614106B (zh) 2018-12-21 2018-12-21 一种c++程序编译方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811569117.6A CN109614106B (zh) 2018-12-21 2018-12-21 一种c++程序编译方法和装置

Publications (2)

Publication Number Publication Date
CN109614106A CN109614106A (zh) 2019-04-12
CN109614106B true CN109614106B (zh) 2022-04-19

Family

ID=66011177

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811569117.6A Active CN109614106B (zh) 2018-12-21 2018-12-21 一种c++程序编译方法和装置

Country Status (1)

Country Link
CN (1) CN109614106B (zh)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110471837A (zh) * 2019-07-05 2019-11-19 平安证券股份有限公司 程序检测方法、装置及计算机可读存储介质
CN110704068B (zh) * 2019-10-18 2023-02-17 安徽中科国创高可信软件有限公司 基于数据库进行跨文件协同程序分析的处理方法及系统
CN111221519B (zh) * 2019-11-12 2020-11-27 广州银汉科技有限公司 一基于Python的CLI自动化导出方法
CN113495728B (zh) * 2020-03-18 2024-06-28 腾讯科技(深圳)有限公司 依赖关系确定方法、装置、电子设备及介质
CN111552466B (zh) * 2020-05-12 2023-03-31 重庆科技学院 工程文件生成方法、系统、计算机设备及存储介质
CN111880805B (zh) * 2020-07-20 2024-07-30 腾讯科技(深圳)有限公司 软件项目的包文件生成方法及装置、设备、存储介质
CN113031961B (zh) * 2021-03-23 2023-04-07 北京百度网讯科技有限公司 编译方法、编译装置、电子设备、存储介质和程序产品
CN113031962B (zh) * 2021-03-23 2022-04-15 北京百度网讯科技有限公司 编译方法、编译装置、电子设备、存储介质和程序产品
CN113050952B (zh) * 2021-04-19 2024-07-05 杭州至千哩科技有限公司 伪指令编译方法、装置、计算机设备及存储介质
CN114089960B (zh) * 2021-10-11 2024-10-25 阿里云计算有限公司 对象处理方法以及装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP2330469A1 (de) * 2009-12-03 2011-06-08 dspace digital signal processing and control engineering GmbH Verfahren und Entwicklungsumgebung zur Erzeugung eines ausführbaren Gesamtsteuerungsprogramms
CN107678748A (zh) * 2017-09-21 2018-02-09 杭州迪普科技股份有限公司 一种源代码文件编译方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108399318B (zh) * 2018-01-31 2020-09-08 北京顶象技术有限公司 可执行文件的生成方法、执行方法及电子设备

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP2330469A1 (de) * 2009-12-03 2011-06-08 dspace digital signal processing and control engineering GmbH Verfahren und Entwicklungsumgebung zur Erzeugung eines ausführbaren Gesamtsteuerungsprogramms
CN107678748A (zh) * 2017-09-21 2018-02-09 杭州迪普科技股份有限公司 一种源代码文件编译方法及装置

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
jamesheros.关于如何将多个Cpp文件关联起来.《CSDN博客,https://blog.csdn.net/u010167037/article/details/19680877》.2014, *
Using libclang to Parse C++ (aka libclang 101);shaharmike;《https://shaharmike.com/cpp/libclang/ 》;20170103;第1-8页 *
关于如何将多个Cpp文件关联起来;jamesheros;《CSDN博客,https://blog.csdn.net/u010167037/article/details/19680877》;20140222;第1-4页 *
多cpp文件 重复定义;gameWYD;《https://blog.csdn.net/gamewyd/article/details/6792113》;20110919;第1-3页 *

Also Published As

Publication number Publication date
CN109614106A (zh) 2019-04-12

Similar Documents

Publication Publication Date Title
CN109614106B (zh) 一种c++程序编译方法和装置
US10394694B2 (en) Unexplored branch search in hybrid fuzz testing of software binaries
CN108369591B (zh) 用于缓存和参数化ir的系统和方法
US11474823B2 (en) Methods, systems, and computer readable media for on-demand, on-device compiling and use of programmable pipeline device profiles
CN107665170B (zh) 一种流程测试方法及装置
CN104320312A (zh) 网络应用安全测试工具及模糊测试用例生成方法和系统
CN110543427B (zh) 测试用例存储方法、装置、电子设备及存储介质
CN113778445A (zh) 一种跨平台组件生成方法、装置、电子设备及存储介质
Binkley et al. Tree-oriented vs. line-oriented observation-based slicing
CN113360156B (zh) 一种ios编译方法及相关设备
CN117032668A (zh) 可视化规则引擎的处理方法、装置、系统及平台
CN111221852A (zh) 基于大数据的混合查询处理方法及装置
CN113495723B (zh) 一种调用功能组件的方法、装置及存储介质
CN113568604B (zh) 风控策略的更新方法、装置及计算机可读存储介质
CN112463628B (zh) 一种基于模型基框架的自主无人系统软件自适应演化方法
CN112395339B (zh) 系统间数据准入校验方法、装置、计算机设备和存储介质
CN114327495A (zh) 基于ast的异常捕获代码注入方法、装置及其应用
CN109343856A (zh) 自定义算法组件的生成方法及装置
CN114115900B (zh) 一种脚本编译方法、装置及电子设备
CN111428209A (zh) 一种应用程序的混淆方法、装置及存储介质
Ipate et al. Model learning and test generation using cover automata
CN114661298A (zh) 公共方法自动生成方法、系统、设备及介质
CN113708971A (zh) 一种Openstack云平台的部署方法及相关装置
CN113590127A (zh) 一种编译数据处理方法、装置、电子设备及存储介质
CN117349332B (zh) 一种应用程序编程接口api的生成方法、装置和电子设备

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