一种软件动态库调试的编译链接方法及系统技术方案

技术编号:27877330 阅读:34 留言:0更新日期:2021-03-31 00:58
本发明专利技术属于软件动态库调试的编译、链接技术领域,其涉及一种软件动态库调试的编译链接方法及系统,其中,该方法包括以下步骤:从第一组源代码文件中获取需要反复修改的源代码文件,形成第二组源代码文件;将第一组源代码文件进行编译、链接,生成的第一动态库链接库;以及将所述第二组源代码文件进行编译链接,生成第二动态链接库;将所述第一动态链接库和所述第二动态链接库共同链接,生成目标可执行程序。本发明专利技术避免了生成大规模动态库的耗时过程,最终提升了动态库调试的编译、链接过程的效率。

【技术实现步骤摘要】
一种软件动态库调试的编译链接方法及系统
本专利技术涉及软件动态库调试的编译链接技术,特别涉及一种软件动态库调试的编译链接方法及系统。
技术介绍
在软件编译中,动态库链接方法是将软件的部分模块单独编译成库的形式(如Linux下.so文件和Windows下的.dll文件等),各独立动态库模块最后链接为最终可运行软件程序。软件程序的动态链接设计方式,有利于动态库在不同软件间共享,动态库提供规范统一的函数接口,隔离与上层运行软件的设计,动态库函数只要保持函数调用接口不变,函数体可以有不同的实现方式,并不会改变上层软件运行。参照图1,各源代码文件通过编译器编译生成对象文件,链接器再将各对象文件链接成动态链接库,最后可执行程序以动态加载的形式调用动态库,动态链接库和可执行程序可以分开独立设计。通常生成动态库是通过链接所有涉及的对象文件(如Linux下的.o文件和Windows下的.obj文件)最后生成一个格式规范的动态库文件。链接的过程涉及对象文件中的可执行代码段、数据块等进行全局代码和数据的整理。但当链接生成大型动态库时,需要依赖成百上千个对象文件,整个过程会变得漫长,甚至超过半小时。最大的问题是当对该动态库进行调试时,每当调试修改其中一个对象文件的源代码,链接过程都要重新对所有对象文件进行布局整理,编译链接过程耗时。对于调试时需要频繁修改对象文件源代码的情况,整个调试编译过程漫长效率低下。可见,这种常用的动态库链接方式并不适合大规模动态库的调试编译。
技术实现思路
本专利技术的目的,在于解决现有动态库程序调试的编译方法中,大规模程序编译链接过程耗时长,和调试(频繁修改)动态库依赖的源代码带来编译链接过程效率低下的技术问题。为实现上述目的,一方面,本专利技术提供一种软件动态库调试的编译链接方法,该方法包括以下步骤:从第一组源代码文件中获取需要反复修改的源代码文件,形成第二组源代码文件;将第一组源代码文件进行编译、链接,生成的第一动态链接库;以及将所述第二组源代码文件进行编译链接,生成第二动态链接库;将所述第一动态链接库和所述第二动态链接库共同链接,生成目标可执行程序。另一方面,本专利技术提供一种软件动态库调试的编译链接系统,该系统包括:第一生成单元,用于从第一组源代码文件中获取需要反复修改的源代码文件,形成第二组源代码文件;第二生成单元,用于将第一组源代码文件进行编译、链接,生成的第一动态库将;以及将所述第二组源代码文件进行编译链接,生成第二动态链接库;第三生成单元,用于将所述第一动态链接库和所述第二动态链接库共同链接,生成目标可执行程序。本专利技术的有益效果是,独立了少量需要调试的文件编译,一般调试涉及的文件数目较少,这几个的调试文件编译过程相对整体文件编译过程很快,生成新动态库并没有涉及修改原动态库,原动态库并不需要重新生成,避免了生成大规模动态库的耗时过程。最终提升了动态库调试的编译链接过程的效率。附图说明图1为现有软件动态库调试的编译链接结构示意图;图2为本专利技术实施例提供的一种软件动态库调试的编译链接方法流程示意图;图3为图2所示软件动态库调试的编译链接结构示意图;图4为本专利技术实施例提供的一种软件动态库调试的编译链接系统结构示意图。具体实施方式下面结合附图与具体实施方式对本专利技术作进一步详细描述。图2为本专利技术实施例提供的一种软件动态库调试的编译链接方法流程示意图。如图2所示,软件动态库调试的编译链接方法,包括以下步骤:步骤S101,从第一组源代码文件中获取需要反复修改的源代码文件,形成第二组源代码文件;具体地,如图3所示,源代码文件(1、2、……、n)为程序的代码内容,源代码文件(1、2、……、n)经过编译后,形成对象文件(1、2、……、n)。一个或多个对象文件可以链接为动态链接库的形式,一个或多个动态链接库被链接为可执行程序。在图3中,左侧框框外部分的内容为第一动态库链接库流程(即图1所示),本专利技术实施例从第一组源代码文件(1、2、……、n)中获取需要反复修改的源代码文件,形成第二组源代码文件(调试文件)。本实施例可以通过复制的方式获取需要反复修改的源代码文件。步骤S102,将第一组源代码文件进行编译、链接,生成的第一动态链接库;以及将所述第二组源代码文件进行编译链接,生成第二动态链接库(新动态链接库);具体地,本专利技术实施例将第一组源代码文件分别编译为对象文件(图3中编号后带“+”符号),然后再链接为第二动态链接库。步骤S103,将所述第一动态链接库和所述第二动态链接库共同链接,生成目标可执行程序。优选地,在链接目标可执行程序的命令行参数中,将所述第二动态链接库路径名放置在所述第一动态链接库路径名前面。第二动态链接库的优先权高于所述第一动态链接库。本专利技术实施例在选择依赖独立的调试文件为一个编译单元的过程,可以通过make和cmake编译工具来辅助,使它们输出所用的编译命令行,这些命令行中能够发现调试文件的依赖关系。比如在make命令中添加VERBOSE=1选项,会输出每个文件的编译和链接过程。以下为一个动态库链接方式的实例过程命令行:CXX=g++${CXX}a.cpp--shared-fPIC-oliba.so//第一组源代码文件编译为第一动态链接库liba.so${CXX}b.cpp--shared-fPIC-olibb.so//第二组源代码文件编译为第二动态链接库liba.so${CXX}c.cpp-L.-lb-la-oc1ba//第二动态链接库libb.so定义的调试函数优先于第一动态链接库${CXX}c.cpplibb.soliba.so-oc2ba//第二动态链接库优先于第一动态链接库./c1ba./c2ba在上述命令行中,第一组源代码文件为a.cpp(通常可以为多个文件),编译为第一动态链接库liba.so,调试文件b.cpp是a.cpp的一个复制修改版本,b.cpp中一般只定义调试函数,只含a.cpp中的部分内容。b.cpp被编译为第二动态链接库libb.so,而主文件c.cpp原目的是需要调用a.cpp中定义的调试函数,因为b.cpp也定义了相同接口的调试函数,在本专利技术实施例中,将第二动态链接库libb.so(对应b.cpp)定义的调试函数优先于第一动态链接库liba.so(对应a.cpp)链接到c.cpp生成的可执行文件中,优先方式是通过在命令行参数中将libb.so放置在liba.so之前,或者lb放置在la之前。在本专利技术实施例中,生成的liba.so一次性生成后,调试的过程中无需修改,修改只在b.cpp中进行,只需要重新生成libb.so。调试完成之后,可以将b.cpp中的修改内容合并到a.cpp中,因此不再需要b.cpp和libb.so,转为常规编译链接方式。图4为本专利技术实施例提供的一种软件动态库调试的编译链接系统结构示意图。本文档来自技高网...

【技术保护点】
1.一种软件动态库调试的编译链接方法,其特征在于,包括以下步骤:/n从第一组源代码文件中获取需要反复修改的源代码文件,形成第二组源代码文件;/n将第一组源代码文件进行编译、链接,生成的第一动态链接库;以及将所述第二组源代码文件进行编译链接,生成第二动态链接库;/n将所述第一动态链接库和所述第二动态链接库共同链接,生成目标可执行程序。/n

【技术特征摘要】
1.一种软件动态库调试的编译链接方法,其特征在于,包括以下步骤:
从第一组源代码文件中获取需要反复修改的源代码文件,形成第二组源代码文件;
将第一组源代码文件进行编译、链接,生成的第一动态链接库;以及将所述第二组源代码文件进行编译链接,生成第二动态链接库;
将所述第一动态链接库和所述第二动态链接库共同链接,生成目标可执行程序。


2.根据权利要求1所述的方法,其特征在于,在链接目标可执行程序的命令行参数中,将所述第二动态链接库路径名放置在所述第一动态链接库路径名前面。


3.根据权利要求1所述的方法,其特征在于,所述第二动态链接库的优先权高于所述第一动态链接库。


4.根据权利要求1所述的方法,其特征在于,通过make和cmake编译工具来辅助,使它们输出所用的编译命令行,这些命令行中能够发现调试文件的依赖关系。


5.一种软...

【专利技术属性】
技术研发人员:徐顺刘倩金钟
申请(专利权)人:中国科学院计算机网络信息中心
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1