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/python
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = 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下的实现
待续