SWIG C++ 预编译 DLL

Posted

技术标签:

【中文标题】SWIG C++ 预编译 DLL【英文标题】:SWIG C++ Precompiled DLL 【发布时间】:2014-03-13 12:25:32 【问题描述】:

我有一个用 C++ 编写的第三方 DLL(无头文件),我可以从开发者那里获得函数原型信息,但它是专有的,他不会提供源代码。

我已经阅读了 SWIG 教程,但我找不到任何地方指定如何使用 SWIG 来仅通过 DLL 文件访问任何函数。教程中的所有内容都表明我需要有标题,以便 SWIG 知道函数原型的样子。

在这种情况下使用 SWIG 是否正确?我正在尝试在 Python 中加载这个 DLL,以便我可以使用一个函数。从我所有的研究来看,Python 的 ctypes 似乎不适用于 C++ DLL 文件,我正在努力寻找最佳途径来做到这一点。 Boost.python 似乎需要更改底层 C++ 代码才能使其与 Python 一起使用。

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

【问题讨论】:

事实证明我们能够获取头文件,所以我应该能够让它与 SWIG 一起正常工作。 【参考方案1】:

即使没有头文件,如果你有原型,你可以自己制作一个头文件,或者直接在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.

【讨论】:

这就是我最终要做的。在您之前与我交谈过的每个人都说没有头文件是不可能的,我也不知道更好。我试了一下,最后让它工作了,谢谢!【参考方案2】:

要使用库(静态或动态),您需要头文件和库文件 .a、.lib...

对于 c++ 是这样,我认为对于 Python 也是如此

【讨论】:

我想我得出的结论是 SWIG 或 boost 可能会起作用,因为这里有各种问题,关于通过 Python 的 ctypes 模块函数 cdll.LoadLibrary('file.dll') python ctypes 使用仅包含 DLL 文件的 C 库也类似于这个问题:***.com/questions/252417/…【参考方案3】:

没有头文件就不能使用 SWIG。您唯一的选择是像 ctypes 这样的库。如果您发现 ctypes 不适合您并且您找不到替代方案,请发布一个问题,说明为什么 ctypes 在您的情况下不可用。

【讨论】:

以上是关于SWIG C++ 预编译 DLL的主要内容,如果未能解决你的问题,请参考以下文章

预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

VS2005 MFC 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

仅编译/预编译 global.asax

预编译(c++常问问题十二)

webservice因引用Oracle.DataAccess.dll导致发布前预编译不通过