Почему Win32 :: ODBC не находит ODBC.dll в Perl 5.10 и Cygwin? - PullRequest
4 голосов
/ 05 мая 2009

Я пытаюсь использовать Perl ODBC для подключения к серверу Microsoft SQL. Моя проблема заключается в том, что Perl 5.10.0 имеет проблемы с использованием драйвера Win32 ODBC.

Если я запускаю оболочку Perl и выполняю эту строку, я получаю ошибки.

use Win32::ODBC;

Can't load '/usr/lib/perl5/vendor_perl/5.10/i686-cygwin/auto/Win32/ODBC/ODBC.dll'
for module Win32::ODBC: No such file or directory at
/usr/lib/perl5/5.10/i686-cygwin/DynaLoader.pm line 201.

Я проверил, что файл dll существует.

Я установил пакеты Cygwin:

  • perl (5.10.0-5)
  • perl-libwin32 (0,28-2)

Ответы [ 2 ]

2 голосов
/ 23 июня 2009

Похоже, это известная проблема . Возьмите libiodbc source , примените следующий патч, соберите и установите:

diff -ub  libiodbc-3.52.6/include/iodbcunix.h.orig
--- libiodbc-3.52.6/include/iodbcunix.h.orig        2006-01-26 09:50:59.000000000 +0000
+++ libiodbc-3.52.6/include/iodbcunix.h     2007-12-24 19:33:57.859375000 +0000
@@ -124,6 +124,7 @@
 #if defined (OBSOLETE_WINDOWS_TYPES)
 typedef unsigned char              BYTE;
 #endif
+#ifndef WIN32
 typedef unsigned short             WORD;
 typedef unsigned int               DWORD;
 typedef char *                     LPSTR;
@@ -131,6 +132,7 @@         
 typedef wchar_t *          LPWSTR; 
 typedef const wchar_t *            LPCWSTR;
 typedef DWORD *                    LPDWORD;
+#endif

 #if !defined(BOOL) && !defined(_OBJC_OBJC_H_)
 typedef int                        BOOL;

ОБНОВЛЕНИЕ: у людей Cygwin есть TODO для этой проблемы , но ему уже несколько месяцев. Если это слишком долго, вы можете подделать его в это время:

#! /bin/bash

# run from the libiodbc build directory

gcc -shared -o cygiodbc-2.dll \
    -Wl,--out-implib=libcygiodbc-2.dll.a \
    -Wl,--export-all-symbols \
    -Wl,--enable-auto-import \
    -Wl,--whole-archive iodbc/.libs/libiodbc.a \
    -Wl,--no-whole-archive

gcc -shared -o cygiodbcinst-2.dll \
    -Wl,--out-implib=libcygiodbcinst-2.dll.a \
    -Wl,--export-all-symbols \
    -Wl,--enable-auto-import \
    -Wl,--whole-archive iodbcinst/.libs/libiodbcinst.a \
    -Wl,--no-whole-archive

cp cygiodbc{,inst}-2.dll /bin
0 голосов
/ 06 июня 2009

Я проверил, что файл dll существует.

Вы имеете в виду, что /usr/lib/perl5/vendor_perl/5.10/i686-cygwin/auto/Win32/ODBC/ODBC.dll существует? Если да, есть ли у вас разрешение на чтение и выполнение?

Существует комментарий чуть выше /usr/lib/perl5/5.10/i686-cygwin/DynaLoader.pm строка 201:

# Many dynamic extension loading problems will appear to come from
# this section of code: XYZ failed at line 123 of DynaLoader.pm.
# Often these errors are actually occurring in the initialisation
# C code of the extension XS file. Perl reports the error as being
# in this perl code simply because this was the last perl code
# it executed.

Так что, похоже, что-то не так с вашей установкой. Вы можете попробовать переустановить Win32 :: ODBC с помощью:

$ cpan Win32::ODBC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...