我正在编写我的第一个项目,它将使用autoconf并在我去的时候自学。在大多数情况下,事情进展顺利。我有一个最后的重大障碍。我无法找到可能从一个系统到另一个系统命名的库和头文件。
例如,我需要使用Mozilla的SpiderMonkey进行编译。从源代码编译时,SpiderMonkey成为libjs.so。但是,在我的Linux版本中,SpiderMonkey作为libmozjs.so安装。它是相同的库,只是一个不同的名称,因此是一个不同的链接器标志。
有没有正确的方法来检测图书馆的名称?我只是将它默认为'js'并给出一个配置选项来覆盖它吗?
我对头文件有相同的情况。 SpiderMonkey的头文件安装在我的操作系统上的/ usr / include / mozjs /中。我相信在其他系统上,它将是/ usr / include / js /或者甚至可能只是/ usr / include /。如何找到正确的头文件位置?我很犹豫做一个香草“发现”,因为它会很慢,我可能会找到错误的文件副本(在用户的主目录中查找文件,而不是/ usr / include /)。
答案 0 :(得分:2)
AC_TRY_LINK(有或没有循环)是不必要的冗余。举个例子,就是这个食谱:
LIBS=""
AC_SEARCH_LIBS([spidermonkey_init], [mozjs js], [sp_libs="$LIBS"; LIBS=""], [])
答案 1 :(得分: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
答案 2 :(得分:0)
我选择了--with-spidermonkey-library= --with-spidermonkey-include=
然后没有指定默认值/搜索选项。 (可能只是默认值)