【调试经验】C++和C的混合编程以及库调用
问题背景
这两天在移植一个开源的库,偏底层的那种,所以对架构有一些依赖。源码的编译是通过Makefile来构建,怎奈公司的架构用的是CMAKE,所以就在开源的顶层和子目录分别构建了CMakeList,但奇怪的是CMAKE产生顶层的Makefile在编译阶段并没有执行,试了一些方法后还是不行,迫于时间压力,只能把项目中用到的源文件提取出来,放到一个文件夹内,单独写CMakeList,最终产生了一个静态库。但是在链接的时候产生了错误,相关函数没定义,又是熟悉的undefined reference to ...,关于这个问题,有篇博客总结的很全面了,这里记录下移植过程遇到的问题及解决过程。
1) nm;查看库中函数是否有实现。查了下,确实有实现,但是链接不到,然后就怀疑是混合编程的问题了,在C++包含C文件的时候加上extern "C" ,搞定;
2)ldd:编译通过后放到测试机上,安装,查看进程状态,failed。。。打开message一瞅,依赖的库没有,ldd一下原来是编译时用到的boost库与测试机上的版本不对,所以找不到。升级编译环境的包,缺少的一些库就从其他机器上拷过来,添加个路径,ldconfig一下,重新安装启动成功。
3)gdb attach pid:好不容易跑起来了,结果,上层来了个命令,咔嚓,挂了。打开message,一地鸡毛...无奈进程启用了多线程,pstree -p pid并不能确定是具体哪个线程崩,cat /proc/pid/stack看了下线程栈,然后猜了一个,attach pid调试,加断点,各种打印输出,最后确定了问题位置。
问题总结
基于linux开发,多会点工具帮助还是很大的。养成随手记录的习惯,有些问题好久遇不到一次,再去网上搜就费劲了,脑子记不住,就用博客来记吧。
PS:给C++的类成员函数打断点时需要加上类名,譬如a::b();
【调试经验】C++和C的混合编程以及库调用的更多相关文章
- [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- Matlab与C++混合编程 1--在C++中调用自己写的matlab函数
在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...
- python c++ 混合编程中python调用c++string返回类型的函数,python中返回为数字的解决办法
本随笔解决 Python使用ctypes 调用c++dll 字符串返回类型函数,在python中显示为数字:原文解决方案见so: https://stackoverflow.com/questions ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- SQL+C#:一次多语言混合编程的经验总结
1.用JAVA做,采取轮询策略: 2.用sql语言+C#混合编程,采取触发策略
- 【5.1送礼】国内第一部Matlab和C#.Net混合编程视频教程【免费】
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了 ...
- 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...
- Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
- C++ 与 MATLAB 混合编程总结(14)
1. 前言 因为毕业设计的需求,研究了一下,C++如何与MATLAB一起混合编程,中间走了一些弯路,这里总结一下. 我用的主要是C++如何调用MATLAB,而没有涉及MATLAB如何调用C++. 注意 ...
随机推荐
- element-ui遮罩层el-dialog的使用
template <el-button type="text" @click="dialogVisible = true">点击打开 Dialog& ...
- ThreadGroupAPI
官方解释 public class ThreadGroup extends Object implements Thread.UncaughtExceptionHandler A thread gro ...
- java编写网站数据抓取
来公司已经俩月了,每天加班平均工时11个小时的我又想起了老东家温馨舒适安逸的生活.已经有好久没时间读博客写博客了,我觉得我退步了,嗯嗯,我很不开心 今天记录下抓数据的一些东西吧. 数据抓取现在是很普遍 ...
- 2015-2016 ACM ICPC Baltic Selection Contest
这是上礼拜三的训练赛,以前做过一次,这次仅剩B题没补.题目链接:https://vjudge.net/contest/153192#overview. A题,水题. C题,树形DP,其实是一个贪心问题 ...
- git reset 版本回退操作
1 git回退命令 git reset --hard GIT_HEAD GIT_HEAD是你具体要回退的分支: 如图: 注: 查询GIT_HEAD可以通过两个命令:git log 获取未删除 ...
- spring事务在web环境中失效的问题
今天温习一下spring事务的时候,出现了一种诡异的现象,在java环境中测试事务是可以的.然后到web下测试事务就没用了.spring.xml配置 spring-mvc.xml配置 后来百度发现是因 ...
- Git 命令行使用
一.git简介: Linux创建了Linux,但是Linux的发展壮大是由世界各地的热心志愿者参与编写的?那么那么多份的代码是怎么合并的呢?之前是在2002年以前,世界各地的志愿者把源代码文件通过di ...
- Wamp win10 1077error
检查日志发现了1077错误 State of services: The service 'wampapache64' is NOT started EXIT error code:1077 He ...
- linux tftp配置 (Ubuntu18.04)
安装tftp客户端和服务器sudo apt-get install tftp-hpa tftpd-hpa xinetdtftp-hpa是客户端tftpd-hpa是服务器 配置文件 sudo vim / ...
- linux简单命令6---挂载