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

sma*_*ica 8 perl berkeley-db activestate windows-7-x64

我想在Windows上使用perl BerkleyDB模块,但我没有设法做到这一点.

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

例如:在Windows 7(64位)上使用CPAN BerkeleyDB模块 但是没有答案.有一个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.
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
    
    Run Code Online (Sandbox Code Playgroud)

    所以我卸载了它并使用了BerkeleyDB 5.3.28(使用.msi).但这也不起作用.然后我发现了一篇文章,作者说他在Windows上成功编译了BerkeleyDB 4.7.25.所以我拿了这个.

变化和问题

如上所述,我使用的是BerkeleyDB库版本4.7.25,但其他版本也出现了以下问题.

从CPAN下载BerkeleyDB-0.54后我做到了

perl Makefile.PL
dmake
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

BerkeleyDB.xs:76:16: fatal error: db.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

原因:perl模块需要知道lib的位置.所以我编辑config.in

INCLUDE = C:\App\BerkeleyDB4.7.25\include
LIB = C:\App\BerkeleyDB4.7.25\lib
DBNAME = -ldb47
Run Code Online (Sandbox Code Playgroud)

文件名C:\App\BerkeleyDB4.7.25\liblibdb47.lib.但我不确定DBNAME预期的结果.所以我尝试了不同的值:

DBNAME = -llibdb47
Run Code Online (Sandbox Code Playgroud)

现在正在运行

dmake
Run Code Online (Sandbox Code Playgroud)

我明白了

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
Run Code Online (Sandbox Code Playgroud)

编译时没有错误,但随后

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'
Run Code Online (Sandbox Code Playgroud)

我非常感谢你的帮助.

像"改变草莓,改用Linux,......"这样的评论是受欢迎的,但我希望我们能够在当前环境中解决这个问题.

Ahm*_*lal -2

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

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

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

此外,您似乎正在使用 ActiveStatePerl,它没有任何问题,但可能值得一试,安装 StrawberryPerl,因为您还没有熟悉 activestateperl 并且不熟悉后者。

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 (2认同)
  • 无论事实如何,它都没有提供明确的答案。 (2认同)
  • 我同意@Rory Mccrossan 的观点。这是一个要尝试的事情的列表 - 一个扩展的评论 - 不是一个答案。 (2认同)