【发布时间】: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 上也是一种痛苦。
标签: perl windows-7-x64 berkeley-db activestate