【调试经验】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++. 注意 ...
随机推荐
- array_merge与array+array的区别
结果:
- ansible的become
# ansible sudo 问题 官方下载centos7.6fcow2镜像不给直接远程ssh了,所以必须sudo,但是有的命令sudo也解决不了的如管道重定向还有多个命令组合. 解决办法: vim ...
- nginx初步学习
今天想学习了解下nginx,找找视频,感觉不适合新手,然后来看阮一峰老师的博客 nginx容器教程:http://www.ruanyifeng.com/blog/2018/02/nginx-docke ...
- HDU 2243 考研路茫茫――单词情结 ——(AC自动机+矩阵快速幂)
和前几天做的AC自动机类似. 思路简单但是代码200余行.. 假设solve_sub(i)表示长度为i的不含危险单词的总数. 最终答案为用总数(26^1+26^2+...+26^n)减去(solve_ ...
- [题解] [BZOJ4144] 「AMPPZ2014」Petrol
题面 怎么是权限题啊 题解 有一次考过, 但是不记得了 如果每个点都是加油站的话, 这道题就是货车运输 考虑如何转化 我们可以设
- 重读APUE(4)-fcntl和ioctl的区别
fcntl(File Control)-文件控制 ioctl(In/Out Control)-I/O控制 1. fcntl作用于文件,提供对文件的基础控制:ioctl作用于文件和设备对象,一般用来向设 ...
- HTTP之基本认证机制
1. 认证 1.1 HTTP 的质询/响应认证框架 HTTP 提供了一个原生的质询/响应(challenge/response)框架,简化了对用户的认证过程. HTTP 的认证模型如下图所示: Web ...
- Unknown system variable 'query_cache_size'
java连接mysql 报错 java.sql.SQLException: Unknown system variable 'query_cache_size'at com.mysql.cj.jdbc ...
- delphi10.3.1不支持.net 5
delphi10.3.1不支持.net 5 安装DELPHI的前提条件:WINDOWS必须安装有.NET. DELPHI安装程序在安装的时候会自动检测.NET是否已经安装好,如果发现没有,它会报错,并 ...
- php操作成功返回当前页并刷新
echo "<script>alert('操作成功');location.href='".$_SERVER["HTTP_REFERER"].&quo ...