我有一个名为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”是必须的
答案 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()