1

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

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

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

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

4

3 回答 3

2

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

LIBS=""
AC_SEARCH_LIBS([spidermonkey_init], [mozjs js], [sp_libs="$LIBS"; LIBS=""], [])
于 2012-05-16T16:25:56.230 回答
1

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

 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
于 2009-01-21T15:54:12.890 回答
0

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

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

于 2009-01-21T14:58:10.897 回答