为什么我的C DLL在Python上被正确导入而不是我的C++ DLL?

2024-10-03 17:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

操作系统:Windows 10 64位

Python:3.9.5 64位

编译器:gcc版本8.1.0(x86_64-posix-seh-rev0,由MinGW-W64项目构建)

问题:我对Python不太了解,我尝试导入一些非常基本的DLL来开始。我不明白为什么在我的计算机上找到了一个C DLL,而找不到C++ DLL。p>

C代码(mini.C):

#include <stdio.h>

extern "C" {

        __declspec( dllexport ) void hi() {

                printf("\nHello World from C !\n");

        }

}

C++代码(mini_cpp.cpp):

#include <iostream>

extern "C" {

        __declspec(dllexport) void hi() {

                std::cout << std::endl << "Hello World from C++ !" << std::endl;

        }

}

Makefile及其结果:

all: mini.dll mini_cpp.dll

mini.dll: mini.o

        g++ mini.o -shared -Wl,--out-implib,libmini.a -o mini.dll

mini.o: mini.c

        g++ -c mini.c -I . -o mini.o

mini_cpp.dll: mini_cpp.o

        g++ mini_cpp.o -shared -Wl,--out-implib,libmini_cpp.a -o mini_cpp.dll

mini_cpp.o: mini_cpp.cpp

        g++ -c mini_cpp.cpp -I . -o mini_cpp.o


g++ -c mini.c -I . -o mini.o

g++ mini.o -shared -Wl,--out-implib,libmini.a -o mini.dll

g++ -c mini_cpp.cpp -I . -o mini_cpp.o

g++ mini_cpp.o -shared -Wl,--out-implib,libmini_cpp.a -o mini_cpp.dll

C DLL的Python代码和结果:

Python 3.9.5 (tags/v3.9.5:0a7dcbd, May  3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>>
>>> import ctypes
>>>
>>> from ctypes import *
>>>
>>> my_lib = windll.LoadLibrary( os.path.abspath( "mini.dll") )
>>>
>>> my_func = my_lib.hi
>>>
>>> my_func.restype = c_char_p
>>>
>>> my_func()

Hello World from C !
强> Python代码和C++ DLL的结果:>/P>
>>> my_cpp_lib = windll.LoadLibrary( os.path.abspath( "mini_cpp.dll") )

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\AGENT_TI\AppData\Local\Programs\Python\Python39\lib\ctypes\__init__.py", line 452, in LoadLibrary
return self._dlltype(name)
  File "C:\Users\AGENT_TI\AppData\Local\Programs\Python\Python39\lib\ctypes\__init__.py", line 374, in __init__
self._handle = _dlopen(self._name, mode)
FileNotFoundError: Could not find module 'C:\Users\AGENT_TI\Desktop\STRINGS\python\mini_cpp.dll' (or one of its dependencies). Try using the full path with constructor syntax.
>>>    

~
~
我已经尝试过的:

  • Python中的不同os.path操作:

chdir(“C:\Users\AGENT\u TI\Desktop\STRINGS\python”)

添加dll目录(“C:\Users\AGENT\u TI\Desktop\STRINGS\python”)

  • 用GCC编译而不是G++(加上-+LSTDC++ + C++代码)

如果有人已经面临这个问题,并有一些修复,谢谢你


Tags: 代码frommylibtioutuserscpp
1条回答
网友
1楼 · 发布于 2024-10-03 17:25:12

Paxdiablo:您对dll问题的假设是正确的(我100%同意消息的不精确性导致了时间的浪费)

objdump向我展示了mini_cpp.dll的以下内容:

DLL Name: libstdc++-6.dll
vma:  Hint/Ord Member-Name Bound-To
9588     1739  _ZNSolsEPFRSoS_E
959c     4448  _ZNSt8ios_base4InitC1Ev
95b8     4450  _ZNSt8ios_base4InitD1Ev
95d4     4738  _ZSt4cout
95e0     4739  _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
9620     4847  _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc

CristiFati:我没有尝试静态构建dll,但我想它确实可以工作

顺便说一下,根据您的直觉(事实上-lstdlibc++最终是我的两个dll之间的唯一区别),我只是在dll之前用Python加载了库 结果是好的(尽管我的字符串下有虚假字符,但我想稍后可以在Python中修复)。它解释了为什么尝试使用boost::python或 pythonapi也导致了同样的问题

修改的Python代码和结果:

>>> import os
>>>
>>> import ctypes
>>>
>>> from ctypes import *
>>>
>>> my_lib = windll.LoadLibrary( os.path.abspath( "mini.dll") )
>>>
>>> my_func = my_lib.hi
>>>
>>> my_func.restype = c_char_p
>>>
>>> my_func()

Hello World from C !
>>>
>>> windll.LoadLibrary("C:\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\x86_64-w64-mingw32\\lib\\libstdc++-6.dll")
<WinDLL 'C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32\lib\libstdc++-6.dll', handle 6fc40000 at 0x25a1f2ade50>
>>>
>>> my_cpp_lib = windll.LoadLibrary( os.path.abspath( "mini_cpp.dll") )
>>>
>>> my_cpp_func = my_cpp_lib.hi
>>>
>>> my_cpp_func.restype = c_wchar_p
>>>
>>> my_cpp_func()

Hello World from C++ !
'\uf038濑'
>>>

感谢您的帮助paxdiablo和CristiFati:-)

相关问题 更多 >