Ошибка компиляции / компоновки при создании BerkeleyDB в Windows 7 (64-битная версия) с Perl64

Я хочу использовать модуль Perl BerkleyDB в Windows, но мне не удается это сделать.

Я знаю, что с этим много проблем, и я прочитал многие вопросы здесь, в SO, а также в других источниках. Но я не нашел решения для этого.

Например, есть: Используйте модуль CPAN BerkeleyDB в Windows 7 (64-разрядная версия), но ответа нет. Существует подсказка для 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

    С моей первой попытки установить BerkelyDB из CPAN MinGW64 (4.5.4) и 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 (Lib от Oracle)

    Сначала я установил BerkeleyDB 6.1.19 из Oracle (используя.msi). Думал, что самая новая версия будет лучшей. После некоторых проблем я снова прочитал описание 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, но следующие проблемы возникали и в других версиях.

После загрузки BerkeleyDB-0.54 из CPAN я сделал

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, ...", приветствуются, но я надеюсь, что мы сможем решить эту проблему в текущей среде.

1 ответ

Я не использовал модуль BerkeleyDB, но вот моя попытка помочь вам.

Во-первых, BerkeleyDB - это БД, написанная на C, оракул, с последней последней версией 6.x (как вы упоминали). Но я не увидел ни одного упоминания о x64 версии установщика msi для того же. Все, что он говорит, - установщик MSI, так что я предполагаю, что это, скорее всего, x86(32 бит), а не x64. И может быть причиной проблем.

BerkeleyDB.pm, с другой стороны, утверждает, что поддерживает и версию 6, действительно, документация еще не ясна. Но я чувствую, что вполне вероятно, что это поддерживает. Плюс, это, кажется, хорошо протестированный и используемый модуль.

Кроме того, кажется, что вы используете ActiveStatePerl, в котором нет ничего плохого, но, возможно, стоит попробовать вместо этого установить StrawberryPerl, ТАК ЧТО, если вы еще не знакомы с activestateperl и не знакомы с последним.

Другие вопросы по тегам