如何生成so文件?
为了生成so文件,只需要修改makefile中的编译参数,主要是加上-shared等参数。我们下面会用一个实例来说明:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27//test_ctypes.cpp
#include "test_ctypes.h"
A::A(int n) {
num = n;
}
A::~A() {
num = 0;
}
int A::get_num() {
return num;
}
//封装
extern "C" {
void* get_instance(int n) {
return new(std::nothrow)A(n);
}
int get_num(void* ptr) {
assert(NULL != ptr);
A* a = reinterpret_cast<A*>(ptr);
return a->get_num();
}
}
1 | //test_ctypes.h |
1 | //makefile |
如何使用ctypes生成python调用接口?
模块ctypes是Python内建的用于调用动态链接库函数的功能模块,但是,在调用C++代码的时候,需要对代码中的函数使用extern “C”进行封装。原因是,由于C++多了函数重载的功能,导致了一个函数不能仅仅用它的名字来确定,编译器会将名字优化成并不是程序中看到的名字。下面是如何在python中使用:1
2
3
4
5
6
7#-*- coding:utf-8 -*-
import ctypes
so = ctypes.cdll.LoadLibrary
test_ctypes = so('./test_ctypes.so')
test_ctypes_ins = test_ctypes.get_instance(4)
print test_ctypes.get_num(test_ctypes_ins)
输出结果是:4