python可以利用SO的方式去调用C++中的函数,但是需要一种调试方案来进行python和C++的联合调试,效果是直接在c++代码中打断点,然后python在进行c++so调用的时候,直接进入到断点处:

testlib.cpp

#include <python2.7_d/Python.h>
using namespace std; PyObject * CFuncEntry(PyObject * self, PyObject *args) { PyObject * datalist = NULL;
PyArg_ParseTuple(args, "O", &datalist);
int rst = 0;
for(int i=0; i < PyList_Size(datalist); ++i){
int val = PyInt_AsLong(PyList_GetItem(datalist, i));
rst += val;
}
return Py_BuildValue("i", rst); } PyMODINIT_FUNC initCFuncEntry(void) {
static PyMethodDef methods[] = {
{"CFuncEntry", (PyCFunction)CFuncEntry, METH_VARARGS, "test lib"},
{NULL, NULL, 0, NULL}
};
Py_InitModule("CFuncEntry", methods);
}

call_cpp.py

#!/usr/bin/python
# -*- encoding utf-8 -*- import CFuncEntry if __name__ == "__main__":
numberlist = [1,2,3,4,5,6,7]
rst = CFuncEntry.CFuncEntry(numberlist)
print rst

setup.py

from distutils.core import setup, Extension                                                                                                                          

module1 = Extension('CFuncEntry',
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0'),
('Py_DEBUG', 1)],
include_dirs = ['/usr/local/include'],
library_dirs = ['/usr/local/lib'],
sources = ['testlib.cpp']) setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
author = 'Martin v. Loewis',
author_email = 'martin@v.loewis.de',
url = 'https://docs.python.org/extending/building',
long_description = '''
This is really just a demo package.
''',
ext_modules = [module1])

将setup.py和testlib.cpp放到同一个目录下,执行python setup.py install

可以看到CFuncEntry.so已经生成,这时执行gdb –args python-dbg call_cpp.py可以进入到gdb调试模式:

可能的问题:

1. python-dbg有可能没有安装,需要执行sudo apt-get install python-dbg进行安装;

2. 直接使用g++ -o CFuncEntry.so testlib.cpp -g -shared -fpic -DEBUG -lpython2.7_d 的方式生成的so会出现如下错误:

undefined symbol: Py_InitModule4_64

3. 直接用g++进行编译,生成so,需要加上Py_DEBUG参数:g++ -o CFuncEntry.so testlib.cpp -g -shared -fpic -DEBUG -lpython2.7_d -DPy_DEBUG

参考资料:

1. http://hustoknow.blogspot.com/2013/06/why-your-python-program-cant-start-when.html

2. https://blog.csdn.net/mydear_11000/article/details/52252363

python和C++联合调试的更多相关文章

  1. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(4)- 联合调试(vspd, sscom, PyCharm2018.2)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之联合调试. 软件开发离不开调试,调试手段分两种:一是黑盒调试,即直接从输入/输出角度测试软件功能是 ...

  2. Jni 调试 : eclipse + Vs 联合调试

    摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4982640.html 1.在Eclipse 中,Java 类中链接库引用到vs的debug目录下 ...

  3. Python如何实现单步调试

    遇到大型python项目,如何定位问题和监控程序的运行状态是一个程序员必须掌握的技能,今天小编为你带来python程序的单步调试方法,方便易用,简单易记! 首先你需要在所调试程序的开头中:import ...

  4. vivado和modelsim联合调试仿真

    vivado和modelsim联合调试仿真 0赞 发表于 2017/5/10 19:10:59 阅读(881) 评论(0) 使用vivado和modelsim联合调试仿真时,在破解完modelsim后 ...

  5. python自带的调试器

    python是自带调试器的. 比如你写了一个python程序,名叫test.py. 你想调试一下这个程序,你可以执行 python -m pdb test.py,就会进入test.py的调试. 想查看 ...

  6. Vivado与SDK的联合调试方法-使用ILA

    首先介绍一下我的硬件平台:使用的开发板为米联客出的MIZ702,这个开发板与ZedBoard是兼容的. Vivado硬件调试有几种手段:ILA(集成逻辑分析器Integrated Logic Anal ...

  7. 64位MATLAB和C混合编程以及联合调试

    [环境说明] 电脑操作系统:win 7 旗舰版,64位 MATLAB版本:R2013b VS版本:Microsoft Visual Studio 2010 [操作说明] 1.在原来工程的基础上添加下列 ...

  8. 转 Python3 错误和异常/ Python学习之错误调试和测试

    ########sample 0 https://www.cnblogs.com/Simon-xm/p/4073028.html except: #捕获所有异常 except: <异常名> ...

  9. 笔记:Python异常处理与程序调试

    Python异常处理与程序调试 Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性.异常处理还具有释放对象,中止循环的运行等作用.在程序运行的过程中,如果发生了错误,可以返回事先约 ...

随机推荐

  1. Redis基础、应用、第三方支持组件总结

    这段时间一直在研究学习Redis的相关知识,现在大概做下总结吧首先,Redis的基础方面,不说配置,就单单说下Redis数据类型:Redis 五大数据类型有String 类型,Hash 类型,List ...

  2. 贪心,打表(或者快速幂), UVA - 11636

    题目链接: https://cn.vjudge.net/problem/34398/origin 题目比较简单,就是水题,基础贪心,大于所需的即可: AC代码: 打表: #include <cm ...

  3. Linux系统模式之间的转换

    1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 ...

  4. php 通用数据库类

    <?php // 数据库连接类 class DB{ //私有的属性 private static $dbcon=false; private $host; private $port; priv ...

  5. [ONTAK2015]Związek Harcerstwa Bajtockiego

    [ONTAK2015]Związek Harcerstwa Bajtockiego 题目大意: 一棵\(n(n\le10^6)\)个点的树,从\(m\)出发,依次执行\(k(k\le10^6)\)条操 ...

  6. Egret 类的创建和继承--TypeScript

    class test extends egret.DisplayObjectContainer { /** * 类的创建 */ //属性 name: string; age: number; ts: ...

  7. java代码发送邮箱验证码与qq邮箱smtp服务

    发送邮箱的类封装,在此之前需要一个jar包  javax.mail.jar 下载链接https://github.com/javaee/javamail/releases/download/JAVAM ...

  8. sql基本查询语句

    查询语句的五中字句:where(条件查询),having(筛选),group by(分组),order by(排序),Limit(限制结果数) 一 单表查询 1.查询指定列:select 列名 fro ...

  9. ionic2 (真正)修改应用图标和启动画面

    今天在用ionic2 的ionic resources生成新的icon和splash,生成后安装,应用图标和启动画面依然没变化... 不知道大家有没有被坑过,今天被坑了一下午,终于找到了办法: 解决方 ...

  10. selenium 3+java 配置全

    之前有配置过java+selenium的环境,感觉将的不够详细,这里重新写一篇,以便日后复习,和大家共享. 一.准备工作. 首先在配置之前需要准备以下:   JDK    Eclipse    Sel ...