AC_CHECK_LIB 在多个地方
AC_CHECK_LIB in multiple places
一些 Oracle 客户端安装同时提供 32 位和 64 位共享库,例如:
$ORACLE_HOME/lib
$ORACLE_HOME/lib32
如何使用 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])
])
])
一些 Oracle 客户端安装同时提供 32 位和 64 位共享库,例如:
$ORACLE_HOME/lib
$ORACLE_HOME/lib32
如何使用 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])
])
])