我有一个问题,在重新编译和重新安装后我无法让Perl DBD :: ODBC使用unixODBC。它之前已安装过。
我编译了DBD :: ODBC以使用DataDirect ODBC驱动程序管理器。我现在想重新编译它以使用unixODBC。然而,尽管从新源开始,配置(它拿起unixODBC),然后编译和安装,它似乎被使用DataDirect ODBC驱动程序管理器。我已经删除了从Perl模块文件夹中删除所有文件(我知道),但重新安装后问题仍然存在。
我正在从源代码编译,因为我正在安装的服务器没有Internet连接,所以我没有使用CPAN。
我在Solaris 10上使用unixODBC 1.2.3和Perl 5.8.4(它与环境相匹配)。
我删除了所有找到的内容:
1. cd /usr/perl5/site_perl/5.8.4/sun4-solaris-64int/auto/DBD/
2. sudo rm -R ODBC
3. cd /usr/perl5/site_perl/5.8.4/sun4-solaris-64int/DBD/
4. sudo rm -R ODBC
5. sudo rm ODBC.pm
6. cd /usr/perl5/5.8.4/man/man3/
7. sudo rm DBD::ODBC.3
8. sudo vi /usr/perl5/5.8.4/lib/sun4-solaris-64int/perllocal.pod
然后我在perllocal.pod
中删除了DBD :: ODBC的所有条目。
我可以看到我在perl Makefile.PL
运行时发现unixODBC。
Looking for odbc_config at /usr/local/unixODBC_sp64/bin/odbc_config
Found odbc_config (via /usr/local/unixODBC_sp64/bin/odbc_config) version 2.3.2
odbc_config reports --prefix=/usr/local/unixODBC_sp64
odbc_config reports --include-prefix=/usr/local/unixODBC_sp64/include
odbc_config reports --lib-prefix=/usr/local/unixODBC_sp64/lib
ODBC INC dir set to /usr/local/unixODBC_sp64/include from odbc_config
ODBC LIB dir set to /usr/local/unixODBC_sp64/lib from odbc_config
Using ODBC HOME /usr/local/unixODBC_sp64
This looks like a unixodbc type of driver manager.
Looking for odbcinst
odbcinst -j reports:
unixODBC 2.3.2
DRIVERS............: /usr/local/unixODBC_sp64/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/unixODBC_sp64/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/unixODBC_sp64/etc/ODBCDataSources
USER DATA SOURCES..: /usr/local/unixODBC_sp64/etc/odbc.ini
以下是我正在编译和安装模块的环境中与ODBC相关的所有环境变量
LD_LIBRARY_PATH=/usr/local/unixODBC_sp64/lib:
LD_LIBRARY_PATH_64=/usr/local/unixODBC_sp64/lib:
PATH=/usr/local/unixODBC_sp64/bin:/usr/sfw/bin:/usr/ccs/bin:/opt/SUNWspro/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/bin
ODBCINI=/usr/local/unixODBC_sp64/etc/odbc.ini
ODBCHOME=/usr/local/unixODBC_sp64
当我运行测试时,我仍然看到DataDirect驱动程序管理器出错:
DBI connect('lksdjhf','ljkshdf',...) failed: [DataDirect][ODBC lib] System information file not found. Please check the ODBCINI environment variable. (SQL-IM002) at ./test_odbcdb2.pl line 19
忽略无法找到驱动程序的事实,因为未填充odbc.ini。我正在使用垃圾连接进行测试,因为我想从unixODBC看到同样的错误消息。
我用于测试的Perl脚本如下。它适用于DataDirect驱动程序管理器。
#!/usr/bin/perl -w
use DBI;
use DBD::ODBC;
use DBD::DB2::Constants;
print "Enter Data Source Name:";
my $dsn =<STDIN>;
chomp $dsn;
my $data_source = "DBI:ODBC:$dsn";
print "Enter Username:";
my $user =<STDIN>;
print "Enter password:";
my $password =<STDIN>;
chomp $user;
chomp $password;
# Connect to the db2 database using odbc
my $dbh = DBI->connect($data_source, $user, $password, {AutoCommit =>1})
or die "Can't connect to $data_source: $DBI::errstr";
$stmt = "SELECT current timestamp from sysibm.sysdummy1; ";
$sth = $dbh->prepare($stmt);
$sth->execute();
#associate variable with output columns...
$sth->bind_col(1,\$timestap);
while ($sth->fetch) {
print "The time is: $timestap\n";
}
$dbh->disconnect;
答案 0 :(得分:2)
你没有说你是否在构建结束时进行了make install,但我认为你做了。
你没有说那些LD_LIBRARY_xx env vars是否也只是设置或导出。
首先,解决其他意见。
在你的Perl树中查找ODBC.so(它应该在一个名为DBD / ODBC的目录中,例如/home/martin/perl5/perlbrew/perls/perl-5.19.10/lib/site_perl/5.19.10/x86_64 -linux /自动/ CAD / ODBC / ODBC.so)。现在运行“ldd ODBC.so”并查看输出中libodbc.so的来源,例如:
$ ldd ./blib/arch/auto/DBD/ODBC/ODBC.so
libodbc.so.1 => /usr/local/lib/libodbc.so.1
libdl.so.1 => /usr/lib/libdl.so.1
libthread.so.1 => /usr/lib/libthread.so.1
libc.so.1 => /usr/lib/libc.so.1
/usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1
这里动态链接器使用/usr/local/lib/libodbc.so.1解析对libodbc.so.1的依赖。您需要告诉动态链接器在您现在查看之前查看unixODBC lib目录。使用LD_LIBRARY_PATH可能不起作用 - 特别是如果您以root身份运行并且有全局方式告诉动态liker在哪里查找。阅读你的ld.so.1第1节手册页。