C++ DLL接入CppUnitTest后布局变更无法加载,求可行测试方案
问题1解答:将测试相关方法移到DLL导出列表末尾的实现方式
你可以通过模块定义文件(.def)强制指定导出表的排列顺序:
- 给你的DLL项目新增一个
.def文件,在文件的EXPORTS配置段中,先按原有顺序列全你业务需要用到的导出函数,再将所有测试相关的导出函数追加到列表的末尾 - 打开DLL项目属性,依次进入「链接器」-「输入」-「模块定义文件」,填入你新增的
.def文件路径,重新编译后链接器会严格按照.def中声明的顺序生成导出表,测试相关函数就会固定在导出表末尾,不会影响原有业务程序对导出函数的寻址
如果不确定测试函数的完整符号名,可以先用dumpbin /exports [生成的DLL路径]命令导出当前的符号列表,提取测试相关的完整符号名填入.def即可。
问题2解答:不转静态库前提下测试DLL非导出函数的替代方案
这里提供两种生产环境常用的稳定方案,均不会修改正式发布版DLL的布局:
- 条件编译分离测试配置
给DLL项目新增一个专属的测试编译配置(例如命名为Debug with UnitTest),给该配置单独添加预处理宏UNIT_TEST_ENABLE,所有单元测试相关的代码都用#if UNIT_TEST_ENABLE ... #endif包裹,只有在测试配置下才会编译进DLL。你正式发布用的Release、普通Debug配置不需要定义这个宏,生成的DLL完全不会包含任何测试相关代码和导出项,从根源上避免布局变更问题,测试用的DLL仅在单元测试环节使用,和正式版本完全隔离。 - 友元声明授权测试访问
单独新建单元测试项目,不需要把测试代码耦合到DLL项目中。在DLL的内部函数、类的声明处,用条件编译包裹针对测试类的友元声明,只有测试编译场景下才会生效,测试项目只需引入DLL的头文件、链接DLL的导入库即可直接访问非导出的内部逻辑,不需要修改正式版DLL的任何编译配置和导出规则。
内容的提问来源于stack exchange,提问作者Asator
相关产品推荐
相关产品推荐

