环境说明
系统:Ubuntu 18.04
python:python 2.7.17
额外环境
上面的环境是普通测试,但是最终标题中的任务我需要在docker中执行,很多块内容我也不太懂,所以一步一步测试
参考链接
1. ubuntu下将c++转换为so文件并利用python调用
正文
所有C++代码均在一个文件中
新建c++代码文件 hello_whole.cpp
,内容如下:
#include <iostream>
using namespace std;
extern "C"{
double add(int, int);
}
double add(int x1, int x2){
return x1+x2;
}
int main(){
int a = 1;
int b =2 ;
int c;
c = add(a,b);
return c;
}
因为python的ctype库调用.so可以调用c,但不能调用c++,所以需要加上extern "C"{...}
,里面放要在python中调用的函数,主函数不用放进去
建好hello_whole.cpp
文件后,打开终端,进入该文件所在的文件夹,执行命令:
g++ hello_whole.cpp -fpic -shared -o libhelloWhole.so
ls
可以看到文件夹下多了一个libhelloWhole.so
动态库
然后在hello_whole.cpp
同文件夹下新建python代码文件 hello.py
,内容如下:
from ctypes import *
lib = CDLL("/absolute/path/to/your/so/file/libhelloWhole.so")
input1 = 100
input2 = 220
result1 = lib.add(input1,input2)
result2 = lib.main()
print (result1,result2)
print '***finish***'
也可以不用绝对路径,但我的会报错,索性直接上绝对路径了
然后就可以看到hello.py
执行hello_whole.cpp
中定义的函数输出了
所有C++代码分散在不同文件夹
因为我的项目涉及到很多分散的代码,不可能放在一个c++文件中;那么显然这里涉及到c++编译生成可执行文件的过程
具体实现跳转至下面链接: