使用Perl64在Windows 7(64位)上构建BerkeleyDB时编译/链接错误

时间:2014-11-04 08:07:15

标签: perl windows-7-x64 berkeley-db activestate

我想在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,......'欢迎,但我希望我们能在当前环境中解决这个问题。

1 个答案:

答案 0 :(得分:-2)

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

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

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

此外,您似乎正在使用ActiveStatePerl,它没有任何错误,但它可能值得一试,安装StrawberryPerl代替,因为您已经熟悉了activestateperl并且不熟悉后者。