加载C++;Python中的类

加载C++;Python中的类,python,c++,dll,Python,C++,Dll,我试图在Python中导入C++类。 但我知道我可以使用BooSypthyon、Sug或Cython,但为了实现这些目的,我尝试用 Extn“C”< /C>手动导出C++方法和函数。简而言之,我正在尝试复制 我的环境是Windows10,有Anaconda3和Python3.6。我已经将mingw64 4.8.3安装为C/C++编译器 这是我的foo.cpp: #include <iostream> // A simple class with a constuctor and so

我试图在Python中导入C++类。 但我知道我可以使用BooSypthyon、Sug或Cython,但为了实现这些目的,我尝试用<代码> Extn“C”< /C>手动导出C++方法和函数。简而言之,我正在尝试复制

我的环境是Windows10,有Anaconda3和Python3.6。我已经将mingw64 4.8.3安装为C/C++编译器

这是我的
foo.cpp

#include <iostream>
// A simple class with a constuctor and some methods...
class Foo
{
    public:
        Foo(int);
        void bar();
        int foobar(int);
    private:
        int val;
};
Foo::Foo(int n)
{
    val = n;
}
void Foo::bar()
{
    std::cout << "Value is " << val << std::endl;
}
int Foo::foobar(int n)
{
    return val + n;
}
// Define C functions for the C++ class - as ctypes can only talk to C...
extern "C"
{
    Foo* Foo_new(int n) {return new Foo(n);}
    void Foo_bar(Foo* foo) {foo->bar();}
    int Foo_foobar(Foo* foo, int n) {return foo->foobar(n);}
}
然后,我以这种方式编译:
g++-shared-Wl,-soname,libfoo.dll-o libfoo.dll foo.o
没有错误/警告。文件夹中已显示文件
libfoo.dll

当我尝试使用Python时:

import ctypes
lib = ctypes.windll.LoadLibrary('libfoo.dll')
我收到错误
OSError:[WinError 126]找不到指定的模块
。我的Python工作目录是
libfoo.dll
文件夹

我试图创建一个简单的C-HelloWorld库:我以同样的方式编译(一个部分
gcc
,而不是
g++
),并成功地将其加载到Python中


问题在哪里?是否在编译说明中?或者在代码中?

我找到了一个从@Scheff comment开始的解决方案

在Linux上(我在Ubuntu16、GCC4.4.0和Python3.6上做过尝试),我的问题代码在没有修改的情况下运行良好(在代码和编译说明上)

在Windows上,我以以下方式修改了
extern“C”
块:

extern "C"
{
     __declspec(dllexport) Foo* Foo_new(int n) {return new Foo(n);}
     __declspec(dllexport) void Foo_bar(Foo* foo) {foo->bar();}
     __declspec(dllexport) int Foo_foobar(Foo* foo, int n) {return foo->foobar(n);}
}
我像以前一样重新编译

此后,我可以导入模块和C++类,如.</P>中所描述的。


< >实现C++打印功能,请参阅.< /p>是否尝试给它一个绝对路径来<代码> .dll < /代码>?当你这样做的时候,记得避开斜杠:
C:\\\\\\\\\\\\\\\libfoo.dll
是的,我试过了。此外,我还尝试将其移动到另一个磁盘(从
E:\\…\\libfoo.dll
C:\\\…\\libfoo.dll
),我不确定mingw g++。在VS中,使函数
extern
对于DLL来说是不够的。如果我想从其他EXE/DLL使用它们,我必须导出它们。出于好奇,我在谷歌上找到了这个:还有这个。明哥似乎也是这样。
extern "C"
{
     __declspec(dllexport) Foo* Foo_new(int n) {return new Foo(n);}
     __declspec(dllexport) void Foo_bar(Foo* foo) {foo->bar();}
     __declspec(dllexport) int Foo_foobar(Foo* foo, int n) {return foo->foobar(n);}
}