测试环境下如何在MyLibTest中用DriverLibStub替换DriverLib?
测试环境中第三方库桩替换的实现方案
相关组件
MyLibTest:基于gtest的测试可执行程序MyLib:自研业务库DriverLib:需要被桩替换的第三方库DriverLibStub:桩实现库
现有依赖关系
MyLibTest -> 链接 MyLib MyLib -> 链接 DriverLib
目标依赖结构
MyLibTest -> 链接 MyLib、DriverLibStub
具体实现方法
1. 利用链接顺序覆盖(通用方案)
链接器按从左到右的顺序查找符号,将桩库放在业务库之前,就能让链接器优先解析桩库中的符号,覆盖原库的实现。
编译命令示例:
g++ MyLibTest.cpp -o MyLibTest -lDriverLibStub -lMyLib
2. 精准替换单个符号(链接器--wrap选项)
如果只需要替换DriverLib中的部分函数而非整个库,可使用链接器的--wrap选项重定向符号:
- 在
DriverLibStub中实现桩函数,命名格式为__wrap_<原函数名>,比如原函数是driver_init(),桩函数就写__wrap_driver_init() - 编译测试程序时添加链接参数:
g++ MyLibTest.cpp -o MyLibTest -lMyLib -lDriverLibStub -Wl,--wrap=driver_init
3. CMake项目配置
若用CMake管理项目,直接调整测试目标的链接顺序即可:
add_executable(MyLibTest MyLibTest.cpp) # 桩库在前,业务库在后,确保符号优先从桩库解析 target_link_libraries(MyLibTest PRIVATE DriverLibStub MyLib)
注意事项
- 若
DriverLib是动态库,需调整测试环境的LD_LIBRARY_PATH,让桩库路径排在原库之前,避免加载到原动态库 - 桩库
DriverLibStub必须实现MyLib用到的所有DriverLib符号,否则会出现链接未定义符号错误
内容的提问来源于stack exchange,提问作者konradk
相关产品推荐
相关产品推荐

