我想在Windows上使用perl BerkleyDB模块,但我无法做到。
我知道这有很多问题,我在这里阅读了很多问题 SO以及其他来源。但是我找不到解决办法。
例如:Use CPAN BerkeleyDB module on Windows 7 (64 bit) 但没有答案。有一个64位补丁的提示,但链接已断开。
Windows 7专业版
Perl 5.16
C:\> perl -v
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2012, Larry Wall
Binary build 1603 [296746] provided by ActiveState http://www.ActiveState.com
Built Mar 13 2013 13:31:10
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
的MinGW
首次尝试从CPAN MinGW64(4.5.4)安装BerkelyDB并自动安装dmake(4.12.20090907)。
C:\>cpan
Set up gcc environment - gcc.exe (rubenvb-4.5.4) 4.5.4
BerkeleyDB 0.54(Perl-Binding)
使用cpan。
BerkeleyDB(来自Oracle的Lib)
首先我从Oracle安装了BerkeleyDB 6.1.19(使用.msi)。认为 最新版本将是最好的。在遇到一些问题之后我会阅读说明 再次cpan BerkeleyDB:
BerkeleyDB - Perl extension for Berkeley DB version 2, 3, 4 or 5
所以我卸载了它并使用了BerkeleyDB 5.3.28(使用.msi)。但这也不起作用。 然后我找到了一篇文章,作者说他成功编译了BerkeleyDB 在Windows上4.7.25。所以我拿了这个。
如上所述,我在BerkeleyDB库版本4.7.25上,但其他版本也出现了以下问题。
从CPAN下载BerkeleyDB-0.54之后我做了
perl Makefile.PL
dmake
我收到了一个错误:
BerkeleyDB.xs:76:16: fatal error: db.h: No such file or directory
原因:perl模块需要知道lib的位置。所以我编辑了config.in
到
INCLUDE = C:\App\BerkeleyDB4.7.25\include
LIB = C:\App\BerkeleyDB4.7.25\lib
DBNAME = -ldb47
C:\App\BerkeleyDB4.7.25\lib
中的文件名为libdb47.lib
。但我不确定DBNAME
期望的是什么。所以我尝试了不同的价值观:
DBNAME = -llibdb47
正在运行
dmake
我得到了
C:\Perl64\cpan\build\BerkeleyDB-0.54-rjSkdy>dmake
Skip blib\lib\BerkeleyDB.pm (unchanged)
Skip blib\lib\BerkeleyDB\Hash.pm (unchanged)
Skip blib\lib\scan.pl (unchanged)
Skip blib\lib\BerkeleyDB.pod (unchanged)
Skip blib\lib\mkconsts.pl (unchanged)
Skip blib\lib\BerkeleyDB\Btree.pm (unchanged)
C:\Perl64\site\bin\gcc.exe -c -IC:\App\BerkeleyDB4.7.25\include -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DWIN64 -DCONSERVATIVE -DPERL_TEXTMODE_SCRIPTS -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DHASATTRIBUTE -fno-strict-aliasing -mms-bitfields -O2 -DVERSION=\"0.54\" -DXS_VERSION=\"0.54\" "-IC:\Perl64\lib\CORE" BerkeleyDB.c
编译时没有错误,但是
Running Mkbootstrap for BerkeleyDB ()
C:\Perl64\bin\perl.exe -MExtUtils::Command -e chmod -- 644 BerkeleyDB.bs
C:\Perl64\site\bin\dlltool.exe --def BerkeleyDB.def --output-exp dll.exp
C:\Perl64\site\bin\g++.exe -o blib\arch\auto\BerkeleyDB\BerkeleyDB.dll -Wl,--base-file -Wl,dll.base -mdll -L"C:\Perl64\lib\CORE" BerkeleyDB.o C:\Perl64\lib\CORE\perl516.lib C:\App\BerkeleyDB4.7.25\lib\libdb47.lib dll.exp
BerkeleyDB.o:BerkeleyDB.c:(.text+0x536): undefined reference to `db_strerror'
...
BerkeleyDB.o:BerkeleyDB.c:(.text+0xd5d): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0xf6d): more undefined references to `db_strerror' follow
BerkeleyDB.o:BerkeleyDB.c:(.text+0x1a73): undefined reference to `db_version'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x1eb8): undefined reference to `db_strerror'
...
BerkeleyDB.o:BerkeleyDB.c:(.text+0x3793): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x39a6): more undefined references to `db_strerror' follow
BerkeleyDB.o:BerkeleyDB.c:(.text+0xa877): undefined reference to `db_sequence_create'
BerkeleyDB.o:BerkeleyDB.c:(.text+0xabb9): undefined reference to `db_strerror'
...
BerkeleyDB.o:BerkeleyDB.c:(.text+0xe10a): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0xeb30): more undefined references to `db_strerror' follow
BerkeleyDB.o:BerkeleyDB.c:(.text+0x18224): undefined reference to `db_create'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x1825e): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x184f4): undefined reference to `db_create'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x1852e): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x189b9): undefined reference to `db_env_create'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x18ccc): undefined reference to `db_create'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x18dd8): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x19799): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x20e53): undefined reference to `db_env_create'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x20fcb): undefined reference to `db_strerror'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x219ad): undefined reference to `db_create'
BerkeleyDB.o:BerkeleyDB.c:(.text+0x26a9a): undefined reference to `db_version'
c:/perl64/site/lib/auto/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.5.4/../../../../x86_64-w64-mingw32/bin/ld.exe: BerkeleyDB.o: bad reloc address 0x20 in section `.data'
c:/perl64/site/lib/auto/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.5.4/../../../../x86_64-w64-mingw32/bin/ld.exe: final link failed: Invalid operation
collect2: ld returned 1 exit status
dmake.exe: Error code 129, while making 'blib\arch\auto\BerkeleyDB\BerkeleyDB.dll'
非常感谢您的帮助。
评论像'改为草莓,改用Linux,......'欢迎,但我希望我们能在当前环境中解决这个问题。
答案 0 :(得分:-2)
我没有使用过BerkeleyDB模块,但这是我试图帮助你的尝试。
首先,BerkeleyDB是一个用C编写的数据库,由oracle编写,当前的最新版本是6.x(正如你所提到的)。但我没有看到,任何提及x64版本的msi安装程序都是一样的。它只是一个.msi安装程序,所以我假设,它很可能是x86(32位)而不是x64。可能会导致问题。
另一方面,BerkeleyDB.pm声称支持版本6,实际上文档尚不清楚。但我觉得它确实支持它。此外,它似乎是一个经过良好测试和使用的模块。
此外,您似乎正在使用ActiveStatePerl,它没有任何错误,但它可能值得一试,安装StrawberryPerl代替,因为您已经熟悉了activestateperl并且不熟悉后者。