加载C++;Python中的类
我试图在Python中导入C++类。 但我知道我可以使用BooSypthyon、Sug或Cython,但为了实现这些目的,我尝试用<代码> Extn“C”< /C>手动导出C++方法和函数。简而言之,我正在尝试复制 我的环境是Windows10,有Anaconda3和Python3.6。我已经将mingw64 4.8.3安装为C/C++编译器 这是我的加载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
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);}
}