AC_CHECK_LIB 在多个地方

AC_CHECK_LIB in multiple places

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

如何使用 autoconf 找到当前目标体系结构的 libclntsh 的正确位置?

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

循环试过:

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不能调用两次。它总是 returns 第一个缓存结果。

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

# 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_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 ... 如果没有找到,我们要重复测试但搜索不同的函数名称。我在 action if not found 案例中插入了一个嵌套的 AC_CHECK_LIB,现在这个块可以正确检测库的旧版本和新版本。

显然,这不是您问题的直接解决方案,但它解决了 "AC_CHECK_LIB cannot be called twice. It always returns the first cached result." 这一事实,正如您在问题中所描述的那样。

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

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])
  ])
])