在自定义变量

时间:2018-01-21 12:31:44

标签: autotools autoconf

我有一个类似于

的存储库
configure.ac
GNUmakefile.in
src
 |--lib
 |--bin

其中src/lib包含要构建的共享库的源,src/bin包含多个二进制文件的源(其中一个包含同一目录中的多个静态库)。

  • 问题1:某些二进制文件也需要与第三方库链接,但不是全部
  • 问题2:其中一个库在Linux和FreeBSD上的命名方式不同

我在this post中看到我可以通过使用AC_SUBST在自定义变量中保存找到的库的名称来解决问题1。但是,当使用像AC_SEARCH_LIBS这样的循环宏时,如何保存第一个找到的库的名称(无论它是什么),即:

AC_SEARCH_LIBS([func], [lib_name_on_linux lib_name_on freebsd], [AC_SUBST([MYLIB], [????])])

一种解决方法是对AC_CHECK_LIB进行两次不同的调用:

AC_CHECK_LIB([lib_name_on_linux], [func], [AC_SUBST([MYLIB], ["-llib_name_on_linux"])])
AC_CHECK_LIB([lib_name_on_freebsd], [func], [AC_SUBST([MYLIB], ["-llib_name_on_freebsd"])])

这样可以工作,因为只有上述AC_CHECK_LIB中的一个会成功,但它很难看,如果没有其他代码,如果我想打印错误(如果没有找到),它将无法工作。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

根据documentationAC_SEARCH_LIBSac_cv_search_(function)变量中缓存生成的库名称。但它确实有两个特殊值(nonone required),但您必须具备特殊情况。所以你的代码看起来像这样:

AC_SEARCH_LIBS([func], [libname_linux libname_freebsd], [
  AS_IF([test x$ac_cv_search_func != "xnone required"],
    [MYLIB=$ac_cv_search_func], [MYLIB=])
  AC_SUBST([MYLIB])
], [
  AC_MSG_ERROR([No library found that provides func()])
])