来自.dll的python中的C ++函数使用ctypes - 找不到函数和访问冲突

时间:2017-05-26 23:01:44

标签: python c++ dll g++ ctypes

我有一个名为hello.cpp的简单C ++代码,它具有打印“Hello world”的功能

#include <iostream>

void hello_world();

int main() {
    std::cout << "Start" << std::endl;
}

void hello_world() {
    std::cout << "Hello world" << std::endl;
}

我使用:

构建.dll(~1.9mb)
g++ -c hello.cpp
g++ -static -fPIC -o hello.dll hello.o

(使用-shared在尝试在python中访问时使用WinError 126 ... module not found

python代码是:

from ctypes import cdll

lib = cdll.LoadLibrary('hello.dll')
lib.hello_world()

这会引发以下错误:

AttributeError: function 'hello_world' not found

我读过人们提到必须使用__declspec(dllexport)包装器,因此extern "C"也是如此,因此代码不会被“损坏”。所以现在使用它作为代码:

#include <iostream>

extern "C" {
    __declspec(dllexport) void hello_world();
}

int main() {
    std::cout << "Opened" << std::endl;
}


void hello_world() {
    std::cout << "hello world" << std::endl;
}

python line lib.hello_world()现在提出:

OSError: exception: access violation writing 0x000E28A0

这里有什么问题?如何让python识别并运行.dll中的C ++函数?我可以跳过中间人并以某种方式从.cpp文件或.o文件运行C ++函数吗?

编辑:

使用eryksun的答案,结果证明不需要dllexport。外部“C”是必须的

1 个答案:

答案 0 :(得分:2)

感谢@eryksun,在这种情况下通过这样的编译解决了这个问题:

g++ -c hello.cpp
g++ -static -shared -o hello.dll hello.o

设置C ++代码如下:

#include <iostream>

int main() {
    std::cout << "Opened" << std::endl;
}

void hello_world() {
    std::cout << "hello world" << std::endl;
}

extern "C" {
    void hello_world();
}

像往常一样从Python运行它:

from ctypes import cdll

lib = cdll.LoadLibrary('hello.dll')
lib.hello_world()