代码之家  ›  专栏  ›  技术社区  ›  dave mankoff

使用Autoconf查找名称可变的库

  •  1
  • dave mankoff  · 技术社区  · 17 年前

    我正在写我的第一个项目,它将使用autoconf,并在我进行的过程中自学。在大多数情况下,事情进展得非常顺利。我还有最后一个重大障碍。我在查找可能因系统不同而命名不同的库和头文件时遇到了问题。

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

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

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

    3 回复  |  直到 14 年前
        1
  •  2
  •   jørgensen    14 年前

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

    LIBS=""
    AC_SEARCH_LIBS([spidermonkey_init], [mozjs js], [sp_libs="$LIBS"; LIBS=""], [])
    
        2
  •  1
  •   BatchyX    17 年前

    除了添加一个选项来显式指定路径/名称外,如果有一些众所周知的名称或位置,你可以按顺序尝试,直到成功为止,使用这样的方法:

     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
  •  0
  •   Douglas Leeder    17 年前

    我会选择: --with-spidermonkey-library= --with-spidermonkey-include=

    然后,如果未指定选项,则使用默认值/搜索。(可能只是默认值)

    推荐文章