Oracle 在多个位置检查库

Oracle 在多个位置检查库,oracle,autoconf,Oracle,Autoconf,某些Oracle客户端安装同时提供32位和64位共享库,例如: $ORACLE\u HOME/lib $ORACLE\u HOME/lib32 如何使用autoconf找到当前目标体系结构的libclntsh的正确位置 AC\u CHECK\u PROG系列具有可选的[path='$path']参数检查库没有 在循环中尝试: saveLIBS=$LIBS for my_archdir in baddir lib32 lib; do LIBS="$saveLIBS -L$ORACLE_H

某些Oracle客户端安装同时提供32位和64位共享库,例如:

  • $ORACLE\u HOME/lib
  • $ORACLE\u HOME/lib32
如何使用
autoconf
找到当前目标体系结构的libclntsh的正确位置

AC\u CHECK\u PROG
系列具有可选的
[path='$path']
参数<代码>检查库没有

在循环中尝试:

saveLIBS=$LIBS

for my_archdir in baddir lib32 lib; do
  LIBS="$saveLIBS -L$ORACLE_HOME/$my_archdir"
  AC_CHECK_LIB([clntsh],[sqlcxt])
done
结果:

checking for sqlcxt in -lclntsh... no
checking for sqlcxt in -lclntsh... (cached) no
checking for sqlcxt in -lclntsh... (cached) no

看起来
AC\u CHECK\u LIB
不能调用两次。它总是返回第一个缓存的结果。

缓存变量名已记录在案。现在,我在下一次迭代之前将其取消设置:

# check $ORACLE_HOME/lib
saveLIBS=$LIBS

# break after 1st try, if was cached; reset if it wasn't
if ${ac_cv_lib_clntsh_sqlcxt+:} false; then :
  my_cont='break'
else
  my_cont='unset ac_cv_lib_clntsh_sqlcxt'
fi

for my_archdir in lib lib32 lib64; do
  LIBS="$saveLIBS -L$ORACLE_HOME/$my_archdir"
  AC_CHECK_LIB([clntsh],[sqlcxt])
  test "x$ac_cv_lib_clntsh_sqlcxt" != "xyes" || break # break if found
  $my_cont
done

我遇到了类似的问题。我使用
AC\u CHECK\u LIB
来确定libdvbpsi是否可用

首先,我使用了以下方法:

AC_CHECK_LIB([dvbpsi], [dvbpsi_pat_attach])
但是后来我意识到,
dvbpsi\u pat\u attach
是一个函数名,它只出现在最新版本中。旧版本的库使用旧的命名约定,函数名为
dvbpsi_AttachPAT
。我自己的项目对库的旧版本和新版本都有向后兼容性支持,所以我应该能够检测到这两个版本。以下是我现在使用的内容:

AC_CHECK_LIB([dvbpsi], [dvbpsi_pat_attach], [], [AC_CHECK_LIB([dvbpsi], [dvbpsi_AttachPAT])])
前两个参数与您习惯使用的参数相同。第三个参数保留为空。此参数是找到的
操作
,我们不需要它。下一个参数是
操作(如果未找到)
。。。如果没有找到,我们希望重复测试,但搜索不同的函数名。我已经在
操作if not found
案例中插入了嵌套的
AC_CHECK_LIB
,现在该块正确检测库的旧版本和新版本

显然,这不是问题的直接解决方案,但它解决了“AC_CHECK_LIB不能调用两次。它总是返回第一个缓存结果”这一事实,正如您在问题中所述

在您的情况下,可以尝试以下代码块:

LIBS="$saveLIBS -L$ORACLE_HOME/baddir"
AC_CHECK_LIB([clntsh], [sqlcxt], [], [
  LIBS="$saveLIBS -L$ORACLE_HOME/lib32"
  AC_CHECK_LIB([clntsh], [sqlcxt], [], [
    LIBS="$saveLIBS -L$ORACLE_HOME/lib"
    AC_CHECK_LIB([clntsh], [sqlcxt])
  ])
])

嵌套检查通常会生成无效的配置脚本:例如,在这种情况下,在调用安全的shell函数后定义的shell函数。在我自己的项目中效果很好:(第47行)