将找到的 AC_SEARCH_LIBS 的名称保存在自定义变量中

Aay*_*ura 1 autoconf autotools

我有一个看起来像这样的存储库

configure.ac
GNUmakefile.in
src
 |--lib
 |--bin
Run Code Online (Sandbox Code Playgroud)

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

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

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

AC_SEARCH_LIBS([func], [lib_name_on_linux lib_name_on freebsd], [AC_SUBST([MYLIB], [????])])
Run Code Online (Sandbox Code Playgroud)

一种解决方法是进行两次不同的调用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"])])
Run Code Online (Sandbox Code Playgroud)

这会起作用,因为上面只有一个AC_CHECK_LIB会成功,但它很丑陋,如果我想打印错误(如果两者都没有找到),那么如果没有额外的代码,它就无法工作。这样做的正确方法是什么?

pto*_*ato 5

根据文档AC_SEARCH_LIBS将生成的库名称缓存在ac_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()])
])
Run Code Online (Sandbox Code Playgroud)