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

Posted

技术标签:

【中文标题】使用 Perl64 在 Windows 7(64 位)上构建 BerkeleyDB 时出现编译/链接错误【英文标题】:Compile/Link error building BerkeleyDB on Windows 7 (64bit) with Perl64 【发布时间】:2014-12-31 01:23:39 【问题描述】:

我想在 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 绑定)

使用 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 4.7.25 在 Windows 上。所以我拿了这个。

变化和问题

如上所述,我使用的是 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'

非常感谢您的帮助。

欢迎评论“改用 Strawberry,改用 Linux,...”,但我希望我们能在当前环境中解决这个问题。

【问题讨论】:

我注意到您的输出在更改 DBNAME 后显示“未更改”。经常配置不应该的脚本缓存设置。您能否重新启动项目(有时 make clean 效果不佳)- 意味着删除整个项目根目录并使用新提取的源重新启动- 并在第一次尝试时使用正确的参数运行配置/编译(make) ? 根据 pm status code.activestate.com/ppm/BerkeleyDB,这个 perl 模块从来没有在 Windows 上工作过。让它工作听起来需要深入研究源代码并进行适当的修改。 你有想过这个吗? @james28909:不。我尽量避免在 windows 上使用 perl,因为 mod_perl 在 windows 上也是一种痛苦。 【参考方案1】:

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

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

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

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

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 如果你把问题看的更清楚了,我的回答完全没问题,既不是批评,也不是要求澄清。 尽管这可能是真的,但它并没有提供明确的答案。 答案就是对问题的回答,它是否是确定的(在你眼中)是不太重要的。它也不保证你对它挑剔。 我同意@Rory Mccrossan。这是要尝试的事情的列表 - 扩展评论 - 不是答案。

以上是关于使用 Perl64 在 Windows 7(64 位)上构建 BerkeleyDB 时出现编译/链接错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 7 中使用 ActivePerl @ARGV 为空

怎样在WINDOWS下面编译OpenSSL

使用 Python 2.7.3 在 64 位 Windows 7 上安装 Numpy [关闭]

Vim 7.4.1952 with Python/Ruby/Lua/Perl/C Syntax built for Ubuntu 16.04 x86_64

如何在 64 位 Perl 中解压缩(64 位)无符号长整数?

perl dbi mysql - 值精度