【问题标题】:Using Autoconf to find variably named libraries使用 Autoconf 查找可变命名的库
【发布时间】:2010-10-02 17:04:30
【问题描述】:

我正在编写我的第一个项目,该项目将使用 autoconf 并在我进行时自学。在大多数情况下,事情进展得非常顺利。我还有最后一个重大障碍。我在定位库和头文件时遇到问题,这些文件的名称可能因系统而异。

例如,我需要使用 Mozilla 的 SpiderMonkey 进行编译。从源代码编译时,SpiderMonkey 变为 libjs.so。然而,在我的 Linux 变体中,SpiderMonkey 安装为 libmozjs.so。它是同一个库,只是名称不同,因此链接器标志不同。

是否有正确的方法来检测库的名称?我是否只是将其默认为“js”并提供配置选项来覆盖它?

我对头文件也有同样的情况。 SpiderMonkey 的头文件安装在我的操作系统上的 /usr/include/mozjs/ 中。我确信在其他系统上,它将是 /usr/include/js/ 或者甚至可能只是 /usr/include/。如何找到正确的头文件位置?我犹豫要不要做一个普通的“查找”,因为它会很慢,而且我可能会找到错误的文件副本(例如,在用户的主目录而不是 /usr/include/ 中查找文件。)

【问题讨论】:

    标签: compilation autoconf configure


    【解决方案1】:

    AC_TRY_LINK(有或没有循环)是不必要的冗余。以这个食谱为例:

    LIBS=""
    AC_SEARCH_LIBS([spidermonkey_init], [mozjs js], [sp_libs="$LIBS"; LIBS=""], [])
    

    【讨论】:

      【解决方案2】:

      除了添加明确指定路径/​​名称的选项外,如果有一些众所周知的名称或位置,您可以按顺序尝试它们,直到成功为止,使用如下方式:

       AC_TRY_LINK([#include "mpi.h"],[MPI_Init(0, 0);], [mpi_link="yes"], [mpi_link="no"]);
      

      或者只是使用测试。我使用以下内容来挑选实际构建的 boost 库,可能名称略有不同:

      for lib in "date_time" "filesystem" "regex" "unit_test_framework" "signals"; do
          if test -f ${$1_libdir}/libboost_$lib-gcc$boost_thread_flag.a; then
            BOOST_LIBS="$BOOST_LIBS -lboost_$lib-gcc$boost_thread_flag"
          elif test -f ${$1_libdir}/libboost_$lib-gcc$boost_thread_flag-s.a; then
            BOOST_LIBS="$BOOST_LIBS -lboost_$lib-gcc$boost_thread_flag-s"
          elif test -f ${$1_libdir}/libboost_$lib$boost_thread_flag.a; then
            BOOST_LIBS="$BOOST_LIBS -lboost_$lib$boost_thread_flag"
          elif test -f ${$1_libdir}/libboost_$lib.a; then
            BOOST_LIBS="$BOOST_LIBS -lboost_$lib"
          fi
      done
      

      【讨论】:

        【解决方案3】:

        我会选择一个选项:--with-spidermonkey-library= --with-spidermonkey-include=

        如果未指定选项,则放置默认值/搜索。 (可能只是默认值)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-30
          • 2018-09-17
          相关资源
          最近更新 更多