Frage Compile / Link Fehler beim Erstellen von BerkeleyDB unter Windows 7 (64bit) mit Perl64


Ich möchte das Perl-BerkleyDB-Modul unter Windows verwenden, aber ich schaffe es nicht.

Ich weiß, dass es viele Probleme gibt und ich lese viele der Fragen hier SO und auch auf anderen Quellen. Aber ich habe keine Lösung dafür gefunden.

Zum Beispiel gibt es: Verwenden Sie CPAN BerkeleyDB Modul unter Windows 7 (64 Bit) Aber es gibt keine Antwort. Es gibt einen Hinweis auf einen 64-Bit-Patch, aber die Verbindung ist unterbrochen.

Umgebung

  • Windows 7 Professional

  • 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

    Mit meinem ersten Versuch, die BerkelyDB von CPAN zu installieren, wurden MinGW64 (4.5.4) und dmake (4.12.20090907) automatisch installiert.

    C:\>cpan 
    Set up gcc environment - gcc.exe (rubenvb-4.5.4) 4.5.4
    
  • BerkeleyDB 0.54 (Perl-Bindung)

    Mit cpan heruntergeladen.

  • BerkeleyDB (Lib von Oracle)

    Zuerst habe ich BerkeleyDB 6.1.19 von installiert Orakel (mit MSI). Dachte daß die neueste Version wäre die beste. Nach einigen Problemen lese ich die Beschreibung von cpan BerkeleyDB nochmal:

    BerkeleyDB - Perl extension for Berkeley DB version 2, 3, 4 or 5
    

    Also habe ich es deinstalliert und BerkeleyDB 5.3.28 (mit .msi) genommen. Aber das hat auch nicht funktioniert. Dann fand ich einen Artikel, in dem der Autor sagte, dass er BerkeleyDB erfolgreich kompiliert habe 4.7.25 unter Windows. Also habe ich diesen genommen.

Änderungen und Probleme

Wie oben beschrieben, bin ich auf der BerkeleyDB-Bibliothek Version 4.7.25, aber die folgenden Probleme traten auch bei den anderen Versionen auf.

Nach dem Herunterladen von BerkeleyDB-0.54 von CPAN tat ich

perl Makefile.PL
dmake

Ich habe einen Fehler erhalten:

BerkeleyDB.xs:76:16: fatal error: db.h: No such file or directory

Grund: Das Perl-Modul muss wissen, wo die Lib ist. Also habe ich das bearbeitet config.in zu

INCLUDE = C:\App\BerkeleyDB4.7.25\include
LIB = C:\App\BerkeleyDB4.7.25\lib
DBNAME = -ldb47

Der Dateiname in C:\App\BerkeleyDB4.7.25\lib ist libdb47.lib. Aber ich bin mir nicht sicher was DBNAME erwartet. Also habe ich verschiedene Werte ausprobiert:

DBNAME = -llibdb47

Jetzt läuft

dmake

Ich bekomme

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

Keine Fehler beim Kompilieren, aber dann

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'

Ich würde Ihre Unterstützung sehr schätzen.

Kommentare wie 'Wechsel zu Strawberry, Wechsel zu Linux, ...' sind willkommen, aber ich hoffe, wir können dieses Problem in der aktuellen Umgebung beheben.


7
2017-11-04 08:07


Ursprung


Antworten:


Ich habe das BerkeleyDB-Modul nicht verwendet, aber hier ist mein Versuch, Ihnen behilflich zu sein.

Zuallererst ist BerkeleyDB eine DB, geschrieben in C, von oracle, wobei die aktuelle Version 6.x ist (wie Sie bereits erwähnt haben). Aber ich habe nicht gesehen, keine Erwähnung über x64-Version des MSI-Installer für die gleiche. Alles was es sagt, ist ein .msi Installer, also nehme ich an, es ist höchstwahrscheinlich x86 (32 Bit) und nicht x64. Und könnte Probleme verursachen.

BerkeleyDB.pm behauptet andererseits, auch die Version 6 zu unterstützen, tatsächlich ist die Dokumentation noch nicht klar. Aber ich denke, es ist wahrscheinlich, dass es es unterstützt. Außerdem scheint es ein gut getestetes und benutztes Modul zu sein.

Weiter scheint es, dass Sie ActiveStatePerl verwenden, was nichts falsch daran hat, aber es könnte einen Versuch wert sein, stattdessen StrawberryPerl zu installieren, das heißt, Sie haben sich mit activestateperl noch nicht vertraut gemacht und sind mit dem späteren nicht vertraut.


-2
2017-11-09 14:50