语言接口的核心是编写接口文件(.i),通过解析C++头文件生成目标语言胶水代码,兼容主流编译器及Python/Java/Node.js/Go等语言,需重点处理类型映射、内存管理与异常转换。
用 SWIG 生成 C++ 多语言接口,核心是写好接口文件(.i),让 SWIG 解析 C++ 头文件并生成目标语言的胶水代码。整个过程不依赖 C++11 以上特性,兼容主流编译器和 Python/Java/Go/Node.js 等语言,关键是把类型映射、内存管理、异常转换这些细节理清楚。
先确保你的 C++ 类或函数有清晰的头文件(如 math_utils.h):
// math_utils.h double add(double a, double b); int factorial(int n);
然后写 SWIG 接口文件 math_utils.i:
%module math_utils
%{
#include "math_utils.h"
%}
%include "math_utils.h"
注意:%{ %} 块里的内容会原样插入生成的包装代码中;%include 让 SWIG 解析头文件——它不预处理宏,所以避免在头文件里用未定义宏或模板声明。
命令行执行(以 Python 3.9 为例):
swig -c++ -python math_utils.i g++ -fPIC -shared math_utils_wrap.cxx math_utils.cpp -I/usr/include/python3.9 -lpython3.9 -o _math_utils.so
关键点:
SWIG 对不同语言的支持程度不同,但基础流程一致:
所有语言都默认不支持 STL 容器、智能指针、重载函数——需要手动添加 typemaps 或用 SWIG 的 %template、%shared_ptr 等指令扩展。
实际绑定时容易卡在这几个地方: