Loading
0

Parasoft C/C++test 测试中 main 函数重复定义解决方案

在Parasoft C/C++test中出现main函数重复定义的情况,通常是由于以下两个原因之一造成的:一是main函数所在的文件被进行了插桩操作;二是测试配置中未勾选“重命名main()函数”选项。

>>点击获取Parasoft C/C++test试用

正常来说,C/C++test在cpptest_testrunner.h中定义main函数,然后会将main函数重命名,如果项目中有多个main函数,那么报错的应该是类似NewMain重复定义这样的报错。报告上面这样的main重复定义的话,说明原项目中的main函数并没有正常被重命名。

解决办法

考虑第一种情况

出现main函数重复定义错误时,首先应检查main函数所在的源文件是否被设置为去插桩。Parasoft C/C++test在执行测试时,会通过向源代码插桩来收集覆盖率数据。若对包含main的文件正常插桩,工具会自动将其重命名,从而避免与测试框架自身的入口函数冲突;但若该文件被排除在插桩范围之外,main函数保持原样,就会引发重复定义错误。

考虑第二种情况

选择运行的测试配置,找到插桩模式的编辑 

查看插桩模式中的“重命名main()函数”,按照下图勾选上。 

其他解决办法

针对Parasoft C/C++test中出现的main函数重复定义问题,除了调整插桩设置和启用“重命名main()函数”功能外,您还可以选择直接使用项目中的main函数作为测试入口。这种方法的核心是切换测试配置的执行模式。

步骤一:

在构建设置中添加预处理器宏定义-DCPPTEST_ENTRY_POINT_DEFINED,其核心作用是向C/C++test工具链发出一个明确的信号,告知其测试执行的入口点已由用户代码自行提供。在默认的“单元测试”模式下,C/C++test为了能够组织并运行测试用例,会自动生成一个它自己的 main 函数作为程序的起点。当项目中也存在一个main函数时,在链接阶段就会因为符号重复定义而导致错误。通过定义此宏,实质上是在指示C/C++test跳过其标准main函数的生成步骤,从而从根源上避免链接冲突。 

步骤二:

上面步骤保证最终可执行程序运行从项目的main函数进入,但这样是不会运行到测试用例代码的,所以还需要对main函数进行修改。需要修改两个地方:

在文件前面添加头文件:

#ifdef PARASOFT_CPPTEST

#include “cpptest.h

#endif

在main函数合适的位置添加如下代码:

#ifdef PARASOFT_CPPTEST

CppTest_Main(0,0);

#endif

关于慧都

慧都是一家行业数字化解决方案公司,专注于软件、石油与工业领域,以深入的业务理解和行业经验,帮助企业实现智能化转型与持续竞争优势。在软件工程领域,我们提供开发控件、研发管理、代码开发、部署运维等软件开发全链路所需的产品,提供正版授权采购、技术选型、个性化维保等服务,帮助客户实现技术合规、降本增效与风险可控。

慧都科技作为Parasoft公司在中国区的官方授权合作伙伴,为国内企业提供Parasoft C/C++test产品的正版授权、定制化部署与全生命周期技术支持与服务。我们致力于助力客户精准贯彻功能安全标准、全面提升软件开发效率、有效管控项目风险,最终构建符合国际标准的高质量软件体系。