SWIG C++ 预编译 DLL

0 投票
3 回答
1677 浏览
提问于 2025-04-17 22:07

我有一个第三方的DLL文件(没有头文件),它是用C++写的。我从开发者那里得到了函数的原型信息,但这是专有的,他不愿意提供源代码。

我看过SWIG的教程,但找不到任何说明如何仅通过DLL文件来使用SWIG访问函数的地方。教程里所有的内容都显示我需要有头文件,这样SWIG才能知道函数原型是什么样的。

在这种情况下,SWIG合适吗?我想在Python中加载这个DLL,以便使用其中的一个函数。从我所有的研究来看,Python的ctypes似乎不支持C++的DLL文件,我正在寻找最佳的解决方案。Boost.python似乎需要修改底层的C++代码才能和Python一起使用。

总之,有没有办法在我知道函数原型但没有头文件或源代码的情况下使用SWIG?

3 个回答

0

SWIG是一个工具,但它需要一些头文件才能使用。如果你没有这些头文件,那你可以考虑用像ctypes这样的库。如果你觉得ctypes不适合你的需求,找不到其他替代方案,那就可以发个问题,说明一下为什么在你的情况下ctypes不能用。

0

要使用一个库(无论是静态库还是动态库),你需要一些头文件和库文件,比如 .a 或 .lib 这样的文件。

这对 C++ 是这样,我觉得 Python 也是一样的。

2

即使没有头文件,如果你有函数的原型,你也可以自己创建一个头文件,或者直接在SWIG接口文件中输入这个原型。

比如,如果原型是:

int sum(const std::vector<int>& vint);

那么SWIG接口会是:

%module example
%{
    #include <vector>
%}
%include <std_vector.i>                # SWIG support
%template() std::vector<int>;          # Generate code to support template instance.

int sum(const std::vector<int>& vint); # Generate wrapper for function.

撰写回答