我有一个简单的C++代码,名为hello.cpp
,其中有一个打印“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"
,以确保代码不会被"mangled"。因此现在使用以下代码:
#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代码中的lib.hello_world()
会引发以下异常:
OSError: exception: access violation writing 0x000E28A0
这里有哪些问题?我该如何让Python识别并运行.dll中的C++函数?我能否跳过中间人,直接从.cpp文件或.o文件中运行C++函数?
编辑:
使用eryksun的答案后,发现不需要dllexport。但extern "C"是必须的。
-static-libstdc++
。 - undefinedobjdump -p hello.dll | grep "DLL Name"
命令检查依赖项。 - undefined