【问题标题】:Autoconf Append to Output Variable and Program Specific LIBSAutoconf 附加到输出变量和程序特定的 LIBS
【发布时间】:2013-01-03 04:12:55
【问题描述】:

在 configure.ac 中使用 autoconf 我需要附加到一个输出变量。

具体来说,我想为我的每个程序(Makefile.am 中的 myprogram1 和 myprogram2)以不同的方式附加到 LIBS 变量。让我们想象一下 myprogram1 需要 -lboost_python 而 myprogram2 需要 -losg。

基本上有些程序需要某些库,而有些则不需要。这是我正在做的一个例子。当然,AC_SUBST 会根据我的理解进行分配(= vs +=),因此这是行不通的。

AC_CHECK_LIB([boost_python], [main], [AC_SUBST([myprogram1_LIBS], ["-lboost_python"])                      
  AC_DEFINE([HAVE_LIBBOOST_PYTHON], [1], [Define if you have libboost_python])],                  
  [AC_MSG_FAILURE([boost_python library not found])])  
AC_CHECK_LIB([osg], [main], [AC_SUBST([myprogram2_LIBS], ["-losg"])                      
  AC_DEFINE([HAVE_LIBOSG], [1], [Define if you have libosg])],                  
  [AC_MSG_FAILURE([osg library not found])])  

我需要的是用第一个库构建 myprogram1_SOURCES,用第二个库构建 myprogram2_SOURCES。

我可以使用 AC_APPEND_SUBST 类型的宏吗?和/或我是否有更好的方法来做我需要做的事情来构建不同的程序并链接不同的库?

【问题讨论】:

    标签: autotools autoconf automake


    【解决方案1】:

    一旦添加了依赖于 osgboost 的 myprogram3,您可能会发现将库检查与其使用情况分开会更方便。

    例如仅使用configure 来确定其中的内容,并使用Makefile 构造正确的编译命令。

    例如(config.ac):

    AC_CHECK_LIB([boost_python], [main], [AC_SUBST([BOOST_LIBS], ["-lboost_python"])                      
      AC_DEFINE([HAVE_LIBBOOST_PYTHON], [1], [Define if you have libboost_python])],                  
      [AC_MSG_FAILURE([boost_python library not found])])  
    AC_CHECK_LIB([osg], [main], [AC_SUBST([OSG_LIBS], ["-losg"])                      
      AC_DEFINE([HAVE_LIBOSG], [1], [Define if you have libosg])],                  
      [AC_MSG_FAILURE([osg library not found])])  
    

    和(Makefile.am)

    myprogram1_LDADD = @BOOST_LIBS@
    myprogram2_LDADD = @OSG_LIBS@
    myprogram3_LDADD = @BOOST_LIBS@ @OSG_LIBS@
    

    【讨论】:

    • 是的,我已经看到这样做了,但我没有这样做的原因是在我的实际程序中,我喜欢包含 20 个库。我宁愿只更新包含在一个地方的库,而不是同时更新 configure.ac 和 Makefile.am。除了这个之外,还有什么令人信服的理由让我实际上应该这样做吗?
    【解决方案2】:

    我假设您的 AC_CHECK_LIB 调用和诸如此类的事情是正确的(如果他们没有,您是否尝试过使用来自 autoconf archive(特别是 AX_BOOST_PYTHON)的宏)?我不敢相信 boost python 和 osg 都提供main

    无论如何,要回答所提出的问题,您不必一次性提供AC_SUBST'd 变量的内容,因此您可以执行以下操作:

    myprogram1_LIBS=""
    AX_BOOST_PYTHON
    myprogram1_LIBS="$myprogram1_LIBS $BOOST_PYTHON_LIB"
    # ...
    AC_SUBST([myprogram1_LIBS])
    

    附:向程序添加库的变量是LDADD or myprogram1_LDADD

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多