Использование Autoconf для поиска библиотек с разными именами - PullRequest
1 голос
/ 21 января 2009

Я пишу свой первый проект, который будет использовать autoconf, и буду учить его самому себе. По большей части дела идут очень хорошо. У меня есть последнее серьезное препятствие. У меня проблемы с поиском библиотечных и заголовочных файлов, которые могут быть по-разному названы в разных системах.

Например, мне нужно скомпилировать SpiderMonkey от Mozilla. При компиляции из исходного кода SpiderMonkey становится libjs.so. Однако в моем варианте Linux SpiderMonkey устанавливается как libmozjs.so. Это та же библиотека, просто другое имя, поэтому другой флаг компоновщика.

Есть ли правильный способ определения названия библиотеки? Должен ли я просто установить по умолчанию значение 'js' и указать параметр конфигурации, чтобы переопределить его?

У меня такая же ситуация с заголовочными файлами. Заголовочные файлы для SpiderMonkey установлены в / usr / include / mozjs / в моей операционной системе. Я уверен, что в других системах это будет / usr / include / js / или, может быть, просто / usr / include /. Как мне найти правильное расположение файла заголовка? Я не решался сделать ванильный «поиск», так как это было бы медленно, и я мог бы найти неправильную копию файла (например, найти файл в домашнем каталоге пользователя вместо / usr / include /.)

Ответы [ 3 ]

2 голосов
/ 16 мая 2012

AC_TRY_LINK (с циклом или без него) излишне избыточен. Взять, к примеру, такой рецепт:

LIBS=""
AC_SEARCH_LIBS([spidermonkey_init], [mozjs js], [sp_libs="$LIBS"; LIBS=""], [])
1 голос
/ 21 января 2009

В дополнение к добавлению опции для явного указания пути / имени, если есть несколько хорошо известных имен или местоположений, вы можете просто попробовать их по порядку, пока не добьетесь успеха, используя что-то вроде этого:

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

Или просто используйте тест. Я использовал следующее, чтобы подобрать библиотеки надстроек, которые были фактически собраны, возможно, с немного другими именами:

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
0 голосов
/ 21 января 2009

Я бы пошел с опцией: --with-spidermonkey-library= --with-spidermonkey-include=

А затем установите значения по умолчанию / поиск, если параметры не указаны. (Возможно просто по умолчанию)

...