发明名称 一种软件工程源代码的分割方法
摘要 一种软件工程源代码的分割方法,是将一个软件工程的源代码进行分割后,产生两个新的软件工程:第一个是从该软件工程中提取出来部分可重用的源代码所生成的链接库文件,以供重用在其他软件工程而节约软件开发成本;第二个是将该软件工程分割后的剩余源代码与生成的链接库文件合并得到的新的软件工程;第二个软件工程经过编译生成的可执行文件功能与分割前的该软件工程功能相同,但是将第二个软件工程中的部分关键代码转化为链接库,实现了隐藏和保护源代码的目的。该方法操作步骤简单、容易,能够快速地将一个软件工程分割为可执行文件、静态链接库或动态链接库,既为软件复用创造条件,又将关键代码替换为链接库,为源代码的保护和隐藏作出贡献。
申请公布号 CN101826014B 申请公布日期 2013.05.08
申请号 CN201010154002.8 申请日期 2010.04.20
申请人 北京邮电大学 发明人 张淼;徐国爱;曹斌;李洋
分类号 G06F9/44(2006.01)I;G06F9/45(2006.01)I 主分类号 G06F9/44(2006.01)I
代理机构 北京德琦知识产权代理有限公司 11018 代理人 夏宪富
主权项 一种软件工程源代码的分割方法,其特征在于:该方法是将一个软件工程的源代码进行分割后,产生两个新的软件工程:第一个是从该软件工程的源代码中提取出来部分可重用的源代码所生成的链接库文件,以供重用在其他软件工程而节约软件开发成本;第二个是将该软件工程的源代码分割后的剩余源代码与所述新生成的链接库文件合并得到的软件工程,第二个软件工程经过编译生成的可执行文件的功能与分割前的该软件工程的功能相同,但是第二个软件工程中的部分关键代码转化为链接库文件,实现了隐藏和保护源代码的目的;所述方法包括下列操作步骤:(1)先分析用户指定的待分割软件工程是否为C或C++语言所编写,以及该待分割软件工程所适用的编译环境是否为该方法所支持;如果不是,则提示用户重新指定软件工程,或者结束该流程;如果是,则顺序执行步骤(2);(2)分析该待分割软件工程的语法,提取每个源文件中的类和函数,以供用户选择准备分割出去的软件工程的源文件;再对该准备分割出去的软件工程的源文件进行实时动态分析,使之满足编译依赖性,再由用户指定分割出去的软件工程类型为动态链接库或静态链接库;所述编译依赖性是一个源文件的编译要依赖于其他源文件的特性;(3)开始分割:先选中要分割出来的目标源文件,找到该目标源文件所在的路径及其依赖的头文件;再将该目标源文件从所在文件夹内删除,并移至新建的链接库软件工程内;(4)完成编译前的检测:对该新建的链接库软件工程进行完整性分析,如遇到缺失的全局变量、宏或资源文件,或者该新建的链接库软件工程内需要用到所述待分割软件工程中的其他链接库文件时,都从该待分割软件工程中提取;(5)生成该新建的链接库软件工程的配置文件和修改头文件,使该新建的链接库软件工程成为分割后的第一个软件工程,且其中定义的函数和类能够被外部其他软件工程调用;根据不同的编译器,该步骤包括下述两种操作方法:如果待分割的软件工程为VC软件工程,则执行下述操作步骤:(501)生成配置文件:从所述待分割的软件工程拷贝扩展名为.dsw的工作区文件至该新建的链接库软件工程,并根据用户选择的类型,将相应的扩展名为.dsp的配置文件拷贝到该新建的链接库软件工程的目录中;再将扩展名为.dsw的工作区文件和.dsp的配置文件重命名为用户指定的软件工程名,在扩展名为.dsp的配置文件中,将所有软件工程名替换为用户指定的软件工程名;依照.dsp的配置文件格式将软件工程中所有源文件、头文件和资源文件全部写入到该扩展名为.dsp的配置文件中;(502)修改头文件:修改该新建的链接库软件工程中的头文件,使定义的函数和类变为可输出;其具体操作内容为:若用户选择的软件工程类型为静态链接库类型,则将所有类声明和函数声明都包含在关键词extem“C”的括号内;若用户选择的软件工程类型为动态链接库类型,则在头文件中加上编译器VC++提供的表示输出函数的修饰符declspec,并包含在关键词extern”C”括号内,或者生成相应的DEF文件;或如果待分割的软件工程为Linux操作系统下的C编译器GCC或G++软件工程,则执行下述操作步骤:(511)在该新建的链接库软件工程内生成配置文件makefile,如果用户选择生成静态链接库,关键操作是将目标源文件中的函数生成扩展名为.a的静态链接库文件*.a;如果用户选择生成动态链接库,则要用‑shared编译选项,以生成扩展名为.so的动态链接库文件*.so;(512)如果用户选择生成动态链接库,还要修改头文件,若原来的函数声明为:返回值类型函数名(参数);则修改为:返回值类型(*函数名)(参数)的形式;(6)对该新建的链接库软件工程进行编译,将头文件和编译生成的库文件一并拷贝到所述待分割软件工程被分割后的剩余源代码中;根据不同的编译器,该步骤包括下述两种不同的操作步骤:如果待分割的软件工程为VC软件工程,则执行下述操作步骤:(601)找到VC的安装目录后,先执行VC安装目录中的批处理文件VCVARS32.BAT,设置VC环境变量;然后转到该新建的链接库软件工程的目录下执行编译命令:msdev %PROJECTB%.dsp或MAKE"all‑Win32 Release";(602)完成编译后,将生成的库文件和所有修改后的头文件都复制到所述待分割软件工程被分割后的剩余源代码中;如果为静态链接库,则生成扩展名为.lib的文件,如果为动态链接库,则分别生成扩展名为.dll的文件和.lib的文件;为方便调用,将扩展名为.lib的文件也一同复制到该待分割软件工程被分割后的剩余源代码中;或如果待分割的软件工程为Linux操作系统下的C编译器GCC或G++软件工程,则执行下述操作步骤:(611)对该新建的链接库软件工程进行编译,生成库文件;如果为静态链接库,就将生成扩展名为.a的静态链接库文件*.a复制至所述待分割软件工程被分割后的剩余源代码中,如果为动态链接库,则将生成扩展名为.so的动态链接库文件*.so复制至linux目录/lib下,再将头文件拷贝回到该待分割软件工程被分割后的剩余源代码中;(7)对步骤(6)将头文件和编译生成的库文件一并拷贝到所述待分割软件工程被分割后的剩余源代码中所得到的第二个软件工程中的源文件进行修改,使第二个软件工程中的源文件能够找到步骤(6)新建的链接库软件工程进行编译生成的库文件;根据不同编译器,该步骤包括下述两种不同的操作步骤:如果待分割的软件工程为VC软件工程,则执行下述操作步骤:(701)用编译器VC++中表示加载静态链接库的指令progma comment加载所生成的扩展名为.lib的文件,如果步骤(6)新建的链接库软件工程进行编译所生成的库文件为动态链接库文件,还要修改头文件,使第二个软件工程中的源文件能正确引用该动态链接库文件中的函数;(702)修改步骤(6)将头文件和编译生成的库文件一并拷贝到所述待分割软件工程被分割后的剩余源代码所得到的第二个软件工程的配置文件,遍历“SOURCE=”行后面的文件名,查询这些文件名所对应的源文件是否都还存在于 第二个软件工程,如果不存在,就删除已分割出去文件的文件名所对应的行;或如果待分割的软件工程为Linux操作系统下的C编译器GCC或G++软件工程,则执行下述操作步骤:(711)重写步骤(6)将头文件和编译生成的库文件一并拷贝到所述待分割软件工程被分割后的剩余源代码中所得到的第二个软件工程的自动化编译文件makefile,删除已经分割出去文件的文件名所对应的行;如果步骤(6)新建的链接库软件工程进行编译生成的库文件为静态链接库,则在主函数main()生成可执行文件时,加上扩展名为.a的静态链接库文件*.a,即加入cc–o main.o*.a命令,即可实现将静态链接库编译到对应的可执行文件中,执行对应的可执行文件,从而实现其原来的功能;只是将原先的部分函数做成了库文件;如果步骤(6)新建的链接库软件工程进行编译所生成的库文件为动态链接库,则先在头文件中包含用于动态链接库管理的系统头文件dlfcn.h,在程序调用到动态链接库里的函数时,先取得所要调用函数的动态地址;在主函数结束前,关闭该动态链接库的指针;(8)对步骤(6)将头文件和编译生成的库文件一并拷贝到所述待分割软件工程被分割后的剩余源代码中所得到的第二个软件工程进行编译,生成新的可执行文件;根据不同的编译器,该步骤包括下述两种不同的操作步骤:如果待分割的软件工程为VC软件工程,则采用编译命令为msdev%PROJECTB%.dsp或MAKE"all‑Win32 Release",生成新的可执行文件;或如果待分割的软件工程为Linux操作系统下的C编译器GCC或G++软件工程,则采用编译命令为make,生成新的可执行文件,且保持原来的功能不变。
地址 100876 北京市海淀区西土城路10号