构建DLL(MyMathFuncs)以在Python Ctypes中使用

时间:2013-08-08 18:20:51

标签: python dll ctypes

作为C ++的新手,我刚刚在MS教程here

之后创建了我的第一个动态链接库

头文件如下所示:

// MathFuncsDll.h

namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        // Returns a + b
        static __declspec(dllexport) double Add(double a, double b);

        // Returns a - b
        static __declspec(dllexport) double Subtract(double a, double b);

        // Returns a * b
        static __declspec(dllexport) double Multiply(double a, double b);

        // Returns a / b
        // Throws DivideByZeroException if b is 0
        static __declspec(dllexport) double Divide(double a, double b);
    };
}

现在,我想将此文件读入Python ctypes。我是这样做的:

import ctypes as ctypes

MyDll = 'MathFuncsDll.dll'
MyFuncs = ctypes.cdll.LoadLibrary(MyDll)

现在,我正在努力实际访问这些功能。我的直觉引导我尝试

a = ctypes.c_double(54)
b = ctypes.c_double(12)

summation = MyFuncs.Add(a,b)

返回错误

AttributeError: function 'Add' not found

我的问题是该函数是否嵌套在class MyMathFuncs内的namespace MathFuncs内?如何获得对这些功能的访问权限?

供参考,以下是用于生成dll的.cpp文件的内容

// MathFuncsDll.cpp
// compile with: /EHsc /LD

#include "MathFuncsDll.h"

#include <stdexcept>

using namespace std;

namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }

    double MyMathFuncs::Multiply(double a, double b)
    {
        return a * b;
    }

    double MyMathFuncs::Divide(double a, double b)
    {
        if (b == 0)
        {
            throw new invalid_argument("b cannot be zero!");
        }

        return a / b;
    }
}

1 个答案:

答案 0 :(得分:3)

您无法使用ctypes访问C ++类和命名空间。 C ++没有标准的二进制接口,就像C一样。每个编译器都为同一个C ++动态库输出它自己的(不同的)二进制文件。您可以阅读更多相关信息here

可以做的事情(如果必须在C ++中完成)是用C ++完成所有工作,然后编写一个包含它并暴露它的C层。然后,您就可以使用ctypes访问它了。同样,你可以阅读它here