windows上编译leveldb.lib和安装plyvel(python库调用levedb.lib)

好久不见. 提交于 2019-12-07 06:10:03

下面的问题没有出现在安装plyvel的过程中,但依旧分析一下,以后方便找到。
这个好像是在安装py-leveldb时遇到的问题:

Python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

Python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
github/mhammond/pywin32
安装pywin32 错误提示3.6找不到注册表信息python version 3.6 required,which was not fount in the registry

依照要求完成了更新,但是仍然不行。

OSError: [WinError 193] %1 不是有效的 Win32 应用程序

可能level.dll不是你python对应版本(当时是32位)的,我dll是64位的?我想应该就是这个问题。修改成对应版本的包即可。

如果你使用leveldb-py,这是一个leveldb的portable版的py库,可能会遇到下面问题(读取ethdb的时候,安装是没问题的,但是如果和我一样要求使用到ethereum上,那么还要去装plyvel(虽然最后还是没什么用就是了(苦笑))):

OpenError: Corruption: many missing files; e.g.: XX.sst

这是因为leveldb-py封装的leveldb的库太老了,因为历史原因leveldb的数据文件由.sst变为了.ldb.这个问题正如下面链接所说,其实将.ldb改为.sst即可。
LevelDB Corruption in npmd
但是这样对新的leveldb库来说,只能读取,不能写入。如果考虑使用leveldb-py,你需要考虑上面那些问题。


下面讲一讲plyvel的坑。
如果你使用pip install plyvel,恐怕会遇到下面问题(时间太久了,记不太清):

Failed building wheel for plyvel

这个意思是,pip能找到所有的版本都与你的系统不适应,所以你就无法安装了。如果你能找到一个plyvel.whl当然更好,但是plyvel的作者并没有提供windows版本的whl,所以不行呢…只能另寻他路了。

考虑将源包下载下来,自己使用下面的命令:

python setup.py install

会出现下面的问题:

LINK : fatal error LNK1181: 无法打开输入文件"leveldb.lib"

这个问题很显然,就是python.exe找不到leveldb.lib,自己编译一个即可(这个即可蕴含巨大工作量…)
省略一万字…(走了弯路)
这里有几个可能的获得leveldb.lib的方法:
1.其他人编译好的lib文件,比如 https://github.com/happynear/py-leveldb-windows/ 的第三方库中的文件。那么根据plyvel官方文档的说法,你的leveldb.lib版本必须>=1.2.0>=1.2.0,如果可行那么可行。
2.leveldb-master,也就是官方包(https://github.com/google/leveldb)。很可惜,这个是不能使用的。主要问题不是其他的,是因为这个安装包是给linux用的。如果你能够重新写一个与./util/env_posix.h功能相同的文件,那么文件就能解决了。
3.leveldb-windows,可以编译,但是版本过老。
4.一位大牛提供的可在windows下编译的新版本leveldb https://github.com/vaskomitanov/leveldb 成功解决问题!
下面是leveldb-vaskomitanov的使用说明书:

1.关于boost库的选择

必须是64位的(address-model=64),link必须为static,因为leveldb是lib(静态的)。runtime-link必须为shared,因为plyvel的库是动态的。必须编译为多线程(threading=multi),版本必须是release版的(release)。toolsets选一个能用的即可。

2.关于编译leveldb.lib

这里提供一个大致正确的安装过程:
windows下编译leveldb(已经验证)
再谈谈一些比较关键的操作:
1.检查代码生成中的运行库应该为/MD
2.编译的版本必须是64位release版。
3.env.posix.h直接剔除即可,因为有env.win.h提供函数。
4.预编译头中应该还有WIN32供编译时识别。

3.关于plyvel安装

1.setup.py的修改
先修改ext_modules:

ext_modules = [
    Extension(
        'plyvel._plyvel',
        sources=['plyvel/_plyvel.cpp', 'plyvel/comparator.cpp'],
        lib_dirs=['lib'],
		libraries=['leveldb vaskomitanov-r x64',
				   'libboost_chrono-vc141-mt-x64-1_69',
				   'libboost_date_time-vc141-mt-x64-1_69',
				   'libboost_filesystem-vc141-mt-x64-1_69',
				   'libboost_system-vc141-mt-x64-1_69',
				   'libboost_thread-vc141-mt-x64-1_69'],
				   
        extra_compile_args=extra_compile_args,
    )
]

注意引入lib库的名称要与你的lib文件一致。然后将lib文件放在python库中的libs中即可。
在setup传参中加入一个:

include_dirs=["leveldb_include"]

leveldb_include为你对应版本源包中提供的Include文件夹位置。

这样应该所有要注意的东西都到位了,如果还有什么不懂的可以留言问我。
参考:
Failed building wheel for xxx 解决办法
github/mhammond/pywin32
安装pywin32 错误提示3.6找不到注册表信息python version 3.6 required,which was not fount in the registry
Python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
Error: ImportError: DLL load failed: %1 is not a valid Win32 application
ERROR:pycharm 出现 DLL load failed: %1 不是有效的 Win32 应用程序
LibSVM中错误:OSError: [WinError 193] %1 不是有效的 Win32 应用程序
LevelDB Corruption in npmd
Cannot open include file: ‘dirent.h’: No such file or directory
windows下编译leveldb(已经验证)
VS2017编译LevelDB
VS2013编译64位boost流程及若干问题
visual studio fatal error C1083: 无法打开源文件
VS 2017 生成dll、lib(动态链接库、静态链接库),并调用
windows下编译leveldb
在windows下配置pthread
windows下sqlite3静态库和动态库的编译
fatal error LNK1104: 无法打开文件“XXX".lib“
Windows注入与拦截(2) – 使用注册表方式完成DLL注入
【python基础知识】调用C++接口(setup.py运行)出现的各种问题
python的构建工具setup.py
C++工程编译之“error LNK2001: 无法解析的外部符号”
fatal error LNK1120: 12 个无法解析的外部命令
Error LNK2001 无法解析的外部符号 的几种情况及解决办法
link 和 runtime-link,搭配shared 和 static
Buidling boost error: Name clash for ‘<pstage\lib>boost_system-vc120-mt-1_58.dll’
“No best alternative for libs/context/build/asm_sources” with armeabi-v7a architecture
boost学习笔记(windows+vs2017+boost1.67 64位编译)
编译并使用boost库(win7+boost1.63+vs2015+32位or 64位)
Windows上安装py-leveldb
cmake:vs2015/MinGW静态编译leveldb
Windows上面编译和简单测试一下leveldb-1.9.0
Windows Equivalent for sys/mman.h
github/witwall/mman-win32
python-packaging
Python Extension Patterns
pip install plyvel not working on Windows platform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!