2

C ++の完全な初心者として、ここにあるMSチュートリアルに従って最初のダイナミックリンクライブラリを作成しました

ヘッダー ファイルは次のようになります。

// 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ですか? これらの機能にアクセスするにはどうすればよいですか?

参考までに.cpp、dll の生成に使用したファイルの内容を以下に示します。

// 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;
    }
}
4

1 に答える 1

3

を使用して C++ クラスおよび名前空間にアクセスすることはできませんctypes。C の場合のように、C++ には標準のバイナリ インターフェイスはありません。すべてのコンパイラは、同じ C++ 動的ライブラリに対して独自の (異なる) バイナリを出力します。詳細については、こちらをご覧ください。

できること(C++ で行う必要がある場合) は、すべての作業を C++ で行い、それをラップして公開する C の小さなレイヤーを作成することです。その後、 を使用してアクセスできるようになりますctypes繰り返しますが、ここでそれについて読むことができます

于 2013-08-08T19:03:40.913 に答える