【问题标题】:Save name of found AC_SEARCH_LIBS in a custom variable将找到的 AC_SEARCH_LIBS 的名称保存在自定义变量中
【发布时间】:2018-01-21 12:31:44
【问题描述】:

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

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 中只有一个会成功,但它很丑陋,如果我想打印一个错误,如果两者都找不到,它不会在没有额外代码的情况下工作。这样做的正确方法是什么?

【问题讨论】:

    标签: autotools autoconf


    【解决方案1】:

    根据documentationAC_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()])
    ])
    

    【讨论】:

    • 谢谢,它确实有效。只是一个小错字:MYLIB=-l$ac_cv_search_func 应该是 MYLIB=$ac_cv_search_func,因为 ac_cv_search_func 的值已经有 -l
    猜你喜欢
    • 2023-03-10
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多