python中调用C++写的动态库

一、环境:Windows XP + Python3.2

1. dll对应的源文件(m.cpp):

 

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2.   
  3. extern "C"  
  4. {  
  5.     _declspec(dllexport) int add(int a, int b)  
  6.     {  
  7.         return a+b;  
  8.     }  
  9.   
  10.     _declspec(dllexport) void print_sum(unsigned long ulNum)  
  11.     {  
  12.         while(ulNum != 0)  
  13.         {  
  14.             printf("The ulNum is : %u\n", ulNum--);  
  15.         }  
  16.     }  
  17. }  


2. python源程序:

 

[python] view plaincopy
 
  1. # coding=GBK  
  2.   
  3. from ctypes import *  
  4. import time  
  5.   
  6. if __name__ == '__main__':  
  7.     time_begin = time.clock()  
  8.   
  9.     #dll = CDLL("d.dll")            # 加载dll方式一  
  10.     dll = cdll.LoadLibrary("d.dll") # 加载dll方式二  
  11.     print(dll.add(2, 6))            # 调用dll中add方法  
  12.     dll.print_sum(100)              # 调用dll中print_sum方法  
  13.   
  14.     t = time.clock() - time_begin   # 计算时间差  
  15.     print("Use time: %f" %t)        # 打印耗时时间  


运行输出:

 

 

[plain] view plaincopy
 
  1. E:\Program\Python>del  
  2. 8  
  3. The ulNum is : 100  
  4. The ulNum is : 99  
  5. The ulNum is : 98  
  6. ...........  
  7. The ulNum is : 2  
  8. The ulNum is : 1  
  9. Use time: 0.003853  
  10.   
  11. E:\Program\Python>  

 

二、环境:Fedora12 + Python2.6

1. 动态库源文件(a.cpp):

 

[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2.   
  3. extern "C"  
  4. {  
  5.     int add(int a, int b)  
  6.     {  
  7.         return a+b;  
  8.     }  
  9.   
  10.     void print_sum(unsigned long ulNum)  
  11.     {  
  12.         while(ulNum != 0)  
  13.         {  
  14.             printf("The ulNum is : %u\n", ulNum--);  
  15.         }  
  16.     }  
  17. }  


编译指令:g++ -shared -o liba.so a.cpp

 

2. python源程序(del.py):

 

[python] view plaincopy
 
  1. #!/usr/bin/env python  
  2. # coding=UTF-8  
  3.   
  4. from ctypes import *  
  5. import time  
  6.   
  7. if __name__ == '__main__':  
  8.     time_begin = time.clock()  
  9.   
  10.     dll = CDLL("./liba.so")                 # 加载dll方式一(默认在系统lib库路径下查找.so文件)  
  11.     #dll = cdll.LoadLibrary("./liba.so")    # 加载dll方式二  
  12.     print(dll.add(2, 6))                    # 调用dll中add方法  
  13.     dll.print_sum(10000)                    # 调用dll中print_sum方法  
  14.   
  15.     t = time.clock() - time_begin           # 计算时间差  
  16.     print("\nUse time: %s" %t)              # 打印耗时时间  


运行结果:与windows版本基本相同!

 

 

结论:Linux上用Python加载动态库时默认是从系统lib路径下是查找库文件的。所以在python中加载当前路径下的动态库的话,路径要写“./liba.so",否则会提示动态库文件找不到!

posted @ 2015-06-18 18:55  张弦  阅读(11953)  评论(0编辑  收藏  举报