Python调用c/c++

来源:互联网 发布:数据分析师待遇 编辑:程序博客网 时间:2024/05/02 06:10

Python调用c/c++,其实是通过加载动态库的方式来实现的,并不是指代码的直接调用。


一、Linux下的实现方式


第一步:编写Test.c

#include <stdio.h>int pythonPrint(){printf("=====hzdeng======\n");printf("=====hzdeng======\n");printf("=====hzdeng======\n");return 0;}

编写完了之后,用gcc进行编译:gcc -o py_test.so -shared -fPIC Test.c

生成py_test.so动态库。


第二步:编写main.py

#!/usr/bin/pythonimport ctypesll = ctypes.cdll.LoadLibrarylib = ll("./py_test.so")lib.pythonPrint()

第三步:运行python main.py

第四步:运行成功。输出如下:

printf("=====hzdeng======\n");printf("=====hzdeng======\n");printf("=====hzdeng======\n");


注意,前面我们用了gcc来编译Test.c,如果用g++来编译Test.c,会是怎样呢?

先重新用g++进行编译g++ -o py_test.so -shared -fPIC Test.c

然后,运行python main.py

会出现这样的结果:

[zdh@localhost c_test]$ python main.py
Traceback (most recent call last):
File "main.py", line 9, in <module>
lib.pythonPrint()
File "/usr/lib64/python2.5/ctypes/__init__.py", line 353, in __getattr__
func = self.__getitem__(name)
File "/usr/lib64/python2.5/ctypes/__init__.py", line 358, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: ./py_test.so: undefined symbol: pythonPrint

提示说明,pythonPrint()接口没有找到。明白这个原因就要知道gcc和g++的一些基本原理了


gcc和g++都是GNU的编译器。

1、对于.c后缀的文件,gcc把它当做是C程序;g++当做是C++程序;
2、对于.cpp后缀的文件,gcc和g++都会当做c++程序;

由于我们用g++编译.c文件,这是Test.c就会被当作cpp来处理,而C++为了支持多态,对函数名进行了修饰,所以用g++编译了之后,pythonPrint不再是pythonPrint了。

因此当然提示找不到。

因此,对于.c的文件,建议用gcc进行编译,而cpp的文件,需要将函数pythonPrint做如下的修饰:

extern "C" int pythonPrint(){printf("=====hzdeng======\n");printf("=====hzdeng======\n");printf("=====hzdeng======\n");return 0;}

extern "C"就是用来强制按照C的方式进行编译的。


添加了extern "C"修饰之后,再重新生成动态库。然后就可以运行OK了。


二、Windows下的实现

待续


0 0
原创粉丝点击