8

我想在 Windows 上使用 perl BerkleyDB 模块,但我做不到。

我知道这有很多问题,我在这里阅读了许多关于 SO 和其他来源的问题。但我没有找到解决办法。

例如有:Use CPAN BerkeleyDB module on Windows 7 (64 bit) 但没有答案。有一个 64 位补丁的提示,但链接已损坏。

环境

  • 视窗 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.
    
  • 明威

    在我第一次尝试从 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 绑定)

    使用 cpan 下载。

  • BerkeleyDB(来自 Oracle 的库)

    首先,我从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)。但这也不起作用。然后我找到了一篇文章,作者说他在Windows上成功编译了BerkeleyDB 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\liblibdb47.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,...”,但我希望我们可以在当前环境中解决此问题。

4

1 回答 1

-2

我没有使用过 BerkeleyDB 模块,但这是我试图对您有所帮助的尝试。

首先,BerkeleyDB 是由 oracle 用 C 语言编写的数据库,当前最新版本是 6.x(如您所述)。但我没有看到任何关于 x64 版本的 msi 安装程序的提及。它所说的只是一个 .msi 安装程序,所以我假设它很可能是 x86(32 位)而不是 x64。并且可能会导致问题。

另一方面,BerkeleyDB.pm 声称也支持版本 6,实际上文档还不清楚。但我觉得它很可能确实支持它。另外,它似乎是一个经过良好测试和使用的模块。

此外,您似乎正在使用 ActiveStatePerl,它没有任何问题,但可能值得一试,改为安装 StrawberryPerl,这是因为您尚未熟悉 activestateperl 加上不熟悉后者。

于 2014-11-09T14:50:20.183 回答