我想在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)和dmake(4.12.20090907)安装BerkelyDB。
    C:\>cpan
    Set up gcc environment - gcc.exe (rubenvb-4.5.4) 4.5.4
    
  • BerkeleyDB 0.54(Perl绑定(bind))

    使用cpan下载。
  • BerkeleyDB(Oracle库)

    首先,我从Oracle(使用.msi)安装了BerkeleyDB 6.1.19。认为
    最新版本将是最好的。遇到一些问题后,我阅读了说明
    再次是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模块需要知道库在哪里。所以我编辑了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'
    

    非常感谢您的协助。

    欢迎使用“更改为Strawberry,更改为Linux,...”之类的评论,但我希望我们可以在当前环境中解决此问题。

    最佳答案

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

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

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

    此外,似乎您使用的是ActiveStatePerl,它没有什么问题,但是,也许应该尝试安装StrawberryPerl,这是因为您尚未熟悉activestateperl以及对后者不熟悉。

    关于perl - 使用Perl64在Windows 7(64位)上构建BerkeleyDB时发生编译/链接错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26730316/

    10-12 22:03