لماذا لا يعثر Win32::ODBC على ODBC.dll ضمن Perl 5.10 وCygwin؟
سؤال
أحاول استخدام Perl ODBC للاتصال بخادم Microsoft SQL.مشكلتي هي أن Perl 5.10.0 يواجه مشكلة في استخدام برنامج تشغيل Win32 ODBC.
إذا قمت بتشغيل Perl Shell وقمت بتنفيذ هذا السطر، سأحصل على أخطاء.
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:
- بيرل (5.10.0-5)
- بيرل libwin32 (0.28-2)
المحلول
يبدو أن هذا أ قضية معروفة.والاستيلاء على مصدر الليبيودبك, ، قم بتطبيق التصحيح التالي وإنشاءه وتثبيته:
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
نصائح أخرى
لقد تأكدت من وجود ملف dll.
هل تعني ذلك /usr/lib/perl5/vendor_perl/5.10/i686-cygwin/auto/Win32/ODBC/ODBC.dll
موجود؟إذا كان الأمر كذلك، هل لديك إذن القراءة والتنفيذ؟
يوجد تعليق أعلى السطر 201 من /usr/lib/perl5/5.10/i686-cygwin/DynaLoader.pm مباشرةً:
# 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