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