加载 dll 并调用函数在 python 中出现错误

问题描述 投票:0回答:1

我正在尝试在 ctypes 中使用 dll,但它给了我错误

我正在尝试制作一个使用 dll 来处理“热重载”情况的 python 应用程序 我不断收到错误

所以我设置了一个测试,认为这是存储在的文件夹

我使用的命令:gcc 在 Windows 上对我来说是坏的

g++ -c .\clib.c -o .\clib.o
g++ -shared .\clib.o -fPIC -o .\clib.dll
py .\main.py

clib.h

#define Export __declspec(dllexport)

Export void display(void);

clib.c

#include <stdio.h>

#include "clib.h"

Export void display(void)
{
    printf("Hello, World!\n");
}

main.py

from ctypes import CDLL
from os import getcwd

CDLL(f"{getcwd()}/clib.dll").display()

我得到的错误

Traceback (most recent call last):
  File "<dev-folder>\main.py", line 4, in <module>
    CDLL(f"{getcwd()}/clib.dll").display()
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\<current-user>\AppData\Local\Programs\Python\Python313\Lib\ctypes\__init__.py", line 403, in __getattr__
    func = self.__getitem__(name)
  File "C:\Users\<current-user>\AppData\Local\Programs\Python\Python313\Lib\ctypes\__init__.py", line 408, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'display' not found

我不知道我是否做错了什么,但请帮助我理解我必须做什么

python c dll ctypes
1个回答
0
投票

我们可以看到名称已损坏,因此您需要使用

extern "C"

objdump show the name is mangled

或者直接使用gcc来编译

© www.soinside.com 2019 - 2024. All rights reserved.