为什么Win32 :: ODBC在Perl 5.10和Cygwin下找不到ODBC.dll?

我正在尝试使用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. 

我已经validation该dll文件确实存在。

我已经安装了Cygwin软件包:

  • perl(5.10.0-5)
  • perl-libwin32(0.28-2)

这似乎是一个已知的问题 。 抓住libiodbc源码 ,应用下面的补丁, 编译并安装:

 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存在吗? 如果是这样,你有读取和执行权限?

在/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