AC_CHECK_LIB在多个地方

时间:2015-12-14 09:54:05

标签: oracle autoconf

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

  • $ORACLE_HOME/lib
  • $ORACLE_HOME/lib32

如何找到autoconf当前目标架构的libclntsh的正确位置?

AC_CHECK_PROG系列具有可选的[path = ‘$PATH’]参数。 AC_CHECK_LIB没有。

试着循环:

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_CHECK_LIB无法被调用两次。它总是返回第一个缓存的结果。

2 个答案:

答案 0 :(得分:0)

记录缓存变量名称。现在我在下一次迭代之前取消它:

# 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

答案 1 :(得分:0)

我遇到了类似的问题。我使用AC_CHECK_LIB来确定libdvbpsi是否可用。

起初,我使用了以下内容:

AC_CHECK_LIB([dvbpsi], [dvbpsi_pat_attach])

但后来我意识到dvbpsi_pat_attach是一个只存在于最新版本中的函数名。较旧版本的库使用较旧的命名约定,该函数名为dvbpsi_AttachPAT。我自己的项目对库的新旧版本都有向后兼容性支持,所以我应该能够检测到这两者。以下是我现在使用的内容:

AC_CHECK_LIB([dvbpsi], [dvbpsi_pat_attach], [], [AC_CHECK_LIB([dvbpsi], [dvbpsi_AttachPAT])])

前两个参数与您习惯的相同。第三个参数留空。这个参数是action if found,我们什么都不需要。下一个参数是action if not found ...如果没有找到,我们想重复测试,但搜索不同的函数名称。我在AC_CHECK_LIB案例中插入了一个嵌套的action if not found,现在这个块正确地检测了库的新版本和新版本。

显然,这不是您问题的直接解决方案,但它解决了“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])
  ])
])