mockcpp的so加载失败问题

简介:
mockcpp的so加载失败问题
 
一、先来看之前已解决的六个so无法加载的问题。
 
把libmockcpp-ut-TestReturnObjectList.so拿来做例子研究so加载问题。
加载成功时的预处理后的.cpp,编译产生的.o.sym/asm,最后的.so.sym
加载不成功时的同样文件。
命令如下:
获取预处理文件:
/usr/bin/c++ -Dmockcpp_ut_TestChainableMockMethod_EXPORTS -DPACKAGE_NAME=\"mockcpp\" -DPACKAGE_STRING=\"mockcpp\" -DPACKAGE_BUGREPORT=\"dev.mockcpp@gmail.com\" -DPACKAGE_URL=\"http://code.google.com/p/mockcpp\" -DPACKAGE=\"mockcpp\" -DVERSION=\"2.4\" -fPIC -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/3rdparty/testngpp/include -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/../3rdparty -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/../include -I/home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/ut/. -o AAAAAA.d -E /home/jelly/Programming/mockcpp_svn_r/mockcpp/mockcpp/tests/ut/TestReturnObjectList.cpp
获取反汇编文件:
objdump -D xxxx.o
获取so的符号表:
nm -D xxx.so
 
1、预处理文件差异。
 
2、nm so文件差异。
 
根据上面情况,已经能看出是result符号链接不到所致。也许编译器认为extern的一个const变量应该有一个变量实体与它对应。
由此,这个问题可以修改如下:(把有差异的两行代码改为下面这样)
        const Any& result2 = Any();
        return getResult(result2, resultProvider);
果然编译链接通过,用例也都运行通过。
 
二、再来看TestApiHook.so加载不成功的问题。
 
它从来都没有被加载成功过,定位难度较大。
 
查找.o的方法:
jelly@jelly-linux:~/Programming/mockcpp/build_tests/ut/CMakeFiles/TestApiHook.dir$ find .. -name "TestApiHook.cpp.o"
../mockcpp-ut-TestApiHook.dir/TestApiHook.cpp.o
 
注释掉两行,加载成功,运行时段错误:
    SETUP() 
    {
        MOCKER(func) 
            .expects(once()); 
            //.with(eq(a), eq(b)) 
            //.will(returnValue(ret)); 
    }
(TestApiHook)
./build.sh: line 18: 9062 段错误 ../../build_testngpp/src/runner/testngpp-runner $(ls *.so) -L"../../build_testngpp/src/listeners" -l"testngppstdoutlistener -c -f"
而且,偶然发现,下面有用例也用到with,will,怎么SETUP中用到就加载失败呢。
--------------------------------
比较下面一处with/will与上面的差异,只不过上面用了static const int 变量。
于是,把它们改为普通成员变量,果然加载成功了。但有段错误问题:./build.sh: line 18: 10109 段错误
--- tests/ut/TestApiHook.h    (版本 434)
+++ tests/ut/TestApiHook.h    (工作副本)
@@ -36,12 +36,15 @@

 FIXTURE(ApiHook)
 {
-    static const int a = 3;
-    static const int b = 5;
-    static const int ret = 10;
+    int a;
+    int b;
+    int ret;

     SETUP()
     {
+        a = 3;
+        b = 5;
+        ret = 10;
         MOCKER(func)
             .expects(once())
             .with(eq(a), eq(b))
-------------------------------------
现在就只是还有段错误问题。
 












本文转sinojelly51CTO博客,原文链接:http://blog.51cto.com/sinojelly/390565 ,如需转载请自行联系原作者
相关文章
|
JavaScript
Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)
Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)
586 0
|
C++ Windows
(1)Qt的基本数据类型以及基本输出
这篇文章介绍了Qt框架中的基本数据类型和日志输出方法,包括如何使用QDebug类及其相关函数进行调试和日志记录,以及如何取消输出时的空格和字符串引号,还提供了抑制输出的两种方式。
482 4
(1)Qt的基本数据类型以及基本输出
|
消息中间件 人工智能 弹性计算
《文档智能 & RAG让AI大模型更懂业务》解决方案评测
一文带你了解《文档智能 & RAG让AI大模型更懂业务》解决方案的优与劣
412 13
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
机器学习/深度学习 人工智能 API
【AI系统】昇腾异构计算架构 CANN
本文介绍了昇腾 AI 异构计算架构 CANN,涵盖硬件层面的达·芬奇架构和软件层面的全栈支持,旨在提供高性能神经网络计算所需的硬件基础和软件环境。通过多层级架构,CANN 实现了高效的 AI 应用开发与性能优化,支持多种主流 AI 框架,并提供丰富的开发工具和接口,助力开发者快速构建和优化神经网络模型。
1056 1
|
Shell 开发工具 git
git学习三:git使用:删除仓库,删除仓库内文件
通过GitHub的设置页面删除仓库,以及如何使用Git命令行删除仓库中的文件或文件夹。
1407 1
git学习三:git使用:删除仓库,删除仓库内文件
|
前端开发 安全 测试技术
短剧cps分销模式系统开发技术规则
短剧CPS分销模式系统开发涉及系统架构设计、数据库设计与实现、功能模块开发、安全性与合规性及开发与测试流程。系统采用前后端分离、微服务架构和容器化技术,确保高性能和可扩展性。功能模块涵盖用户管理、短剧管理、分销机制、支付接口和数据分析,确保系统的全面性和安全性。
|
传感器 监控 供应链
IoT 和 IIoT 有什么区别
IoT(物联网)是指通过互联网连接各种日常设备,实现数据交换和远程控制的技术。而IIoT(工业物联网)则是专为工业领域设计的IoT,强调在制造业、能源等行业的应用,注重提高生产效率、优化流程和增强安全性。两者主要区别在于应用场景和目标不同。
|
数据采集 缓存 JavaScript
​DrissionPage,Python浏览器自动化又一神器~
​DrissionPage,Python浏览器自动化又一神器~
636 1