python中调用c++
来源:互联网 发布:通化县教育局网络办公 编辑:程序博客网 时间:2024/05/23 13:09
- 编译一个要引用的动态链接库:XXX.so
- gcc/g++ -fPIC xxx.cpp -o xxx.so -shared -I/usr/include/python2.7 -I/usr/lib/python2.7/config(-I为大写的i)
- 在python脚本中:
import ctypesso = ctypes.CDLL('./xxx.so')so.fun(a,b)
或者使用
so=ctypes.cdll.LoadLibrarylib = so("./xxx.so")lib.fun(a,b)
gcc参数解释
-I(大写的i)告诉编译器去哪个文件夹找头文件
-fPIC
这里有一个-fPIC参数
PIC就是position independent code
PIC使.so文件的代码段变为真正意义上的共享
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于这个.so文件代码段和数据段内存映射的位置.
不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
如果被多个应用程序共同使用,那么它们必须每个程序维护一份so的代码副本了.(因为so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)
我们总是用fPIC来生成so,也从来不用fPIC来生成a.
fPIC与动态链接可以说基本没有关系,libc.so一样可以不用fPIC编译,只是这样的so必须要在加载到用户程序的地址空间时重定向所有表目.
因此,不用fPIC编译so并不总是不好.
如果你满足以下4个需求/条件:
1.该库可能需要经常更新
2.该库需要非常高的效率(尤其是有很多全局量的使用时)
3.该库并不很大.
4.该库基本不需要被多个应用程序共享
如果用没有加这个参数的编译后的共享库,也可以使用的话,可能是两个原因:
1:gcc默认开启-fPIC选项
2:loader使你的代码位置无关
从GCC来看,shared应该是包含fPIC选项的,但似乎不是所以系统都支持,所以最好显式加上fPIC选项。
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
- C中调用PYTHON
- c中调用python
- python中调用c库
- python中调用c库
- C语言中调用python
- python调用c中函数
- C/C++中如何调用Python方法
- C/C++ 中对Python的调用
- C,C++代码中调用python脚本
- 【编程语言】C中调用Python脚本
- C,C++代码中调用python脚本
- 在Python中调用C++,使用SWIG
- C/C++中如何调用Python
- makehuamn中python与C++/c相互调用
- BCB(C++)调用Python
- C调用python
- C调用python
- Python 调用 C函数
- Web项目同时使用Struts2和SpringMVC
- Hibernate基于持久层框架的DAO模式应用
- Android Studio JNI开发入门教程
- JavaSE 学习参考:字节流和字符流转换
- PhantomJS :一个基于 WebKit 的服务器端 JavaScript API。
- python中调用c++
- 遇到的一个MR处理业务
- Android studio 2.2里的scratch file设置
- PreferenceActivity的使用
- python UUID学习总结
- 利用互相关方法校正二维图像移动
- LabVIEW顺序结构是小时候相机里一帧一帧的胶卷
- PHImageManager 访问相册 内存问题
- 图片上传