下载地址或者联系笔者邮箱

dll找不到 java dll找不到指定模块怎么办 python_Python

  • 位数如果不匹配的话,报的错误不是126,而是193。这种情况直接重新使用x64重新编译生成64位的库文件即可。

Traceback (most recent call last):

File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module> LoadDll() File "E:/WorkSpace/BT/DemoProject/main.py", line 13, in LoadDll lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll") File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 364, in __init__ self._handle = _dlopen(self._name, mode) OSError: [WinError 193] %1 不是有效的 Win32 应用程序。

dll找不到 java dll找不到指定模块怎么办 python_dll找不到 java_02

dll找不到 java dll找不到指定模块怎么办 python_dll找不到 java_03

如果是出现函数调用问题(stdcall和cdecl两种方式),应该不是找不到模块,而是找不到对应的函数,这里就用到了C++重载和C不支持重载以及extern “C”的东西,具体可以看笔者这篇文章。这种情况需要在dll库中的函数名声明时添加extern “C”修饰

静态库(lib)与动态库(DLL)----函数重载的理解

笔者在调试的时候,尝试了一下,发现了这个情况。DLL库程序:直接编译可形成DLL库。

#ifndef PCH_H
#define PCH_H

#include "framework.h"
#include "iostream"

#define LIB_API  __declspec(dllexport)

LIB_API void HelloWorld();
LIB_API int  Sub(int a, int b);

#endif 


#include "pch.h"
using namespace std;

LIB_API void HelloWorld()
{
	cout << "HelloWorld" << endl;
}


LIB_API int  Sub(int a, int b)
{
	return ((a)-(b));
}Python调用程序:def LoadDll():
    lib = ctypes.CDLL("E:\WorkSpace\BT\DemoProject\HelloWorld.dll")
    lib.HelloWorld()
    lib.Sub.argtypes = (c_int,c_int)
    lib.Sub.restype = c_int
    print(lib.Sub(3,1))
    return lib.Sub(3,1)报错:
Traceback (most recent call last):
  File "E:/WorkSpace/BT/DemoProject/main.py", line 28, in <module>
    LoadDll()
  File "E:/WorkSpace/BT/DemoProject/main.py", line 14, in LoadDll
    lib.HelloWorld()
  File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 377, in __getattr__
    func = self.__getitem__(name)
  File "C:\Users\guoqing.zhang\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 382, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'HelloWorld' not found

五、其他相关问题:

dll找不到 java dll找不到指定模块怎么办 python_dll找不到 java_04


笔者打开一个xxx_db.so,提示libc++_shared.so 找不到,然后就想到需要看一下哪些库缺少,使用objdump

dll找不到 java dll找不到指定模块怎么办 python_C++_05


然后将笔者需要找到编译器编译时所需要的库,对应的其编译器版本的库

dll找不到 java dll找不到指定模块怎么办 python_DLL_06


然后需要放到对应的库的目录下面,比如lib64目录等。

之后又碰到问题,笔者直接在python环境下导入xxx_db.so,发现还是不行,报如下错误:Pyinit_xxx_db 里面没有定义导出函数

dll找不到 java dll找不到指定模块怎么办 python_DLL_07


咨询同事发现,原来不是所有的动态库都可以被导入,只有定义了初始化的函数才可以,所以只能通过ctype.CDLL导入,所以后续就可以使用了。

dll找不到 java dll找不到指定模块怎么办 python_dll找不到 java_08